2013-07-19 4 views
6

Я пытаюсь понять, как обмениваться данными между моими контроллерами/маршрутами.Обмен данными в ember

У меня есть приложение, отображающее данные о компаниях. Вот маршруты, которые я хочу:

/    summary info 
/companies  list of all companies with some more detail 
/companies/:id details about a single company 

Теперь данные, необходимые для всех трех маршрутов, содержатся в одном массиве данных компании. Поэтому я хочу, чтобы эти данные загружались, когда приложение запускалось, а затем использовалось для каждого маршрута. Есть также дополнительные методы, которые мне понадобятся на контроллере, который должен быть общим.

Очевидно, что вторые и третьи маршруты вложенные, так что я могу обмениваться данными из CompaniesController когда я ссылку на конкретную компанию, передав данные этой компании:

{{#linkTo 'company' company}}{{ company.name }}{{/linkTo}} 

Но резюме маршрут - это то место, где я застреваю. Два варианта я придумал:

  1. Создание CompaniesController с любыми дополнительными методами, мне нужно, и создать IndexController путем расширения его

    App.IndexController = App.CompaniesController.extend({}); 
    

    Тогда, насколько я могу судить, как маршруты нужно будет найти модели:

    App.Router.map(function() { 
        this.resource('companies'); 
    }); 
    
    App.CompaniesRoute = Ember.Route.extend({ 
        model: function() { 
         return App.Company.find(); 
        } 
    }); 
    
    App.IndexRoute = Ember.Route.extend({ 
        model: function() { 
         return App.Company.find(); 
        } 
    }); 
    

    Похоже, там должно быть лучше, так как я должен повторить это для каждого нового маршрута я добавить (например, /revenue).

  2. Настройте маршрут в пределах companies ресурса и укажите путь '/'. Что мне не нравится в этом, так это то, что «вложенность» моего пользовательского интерфейса не соответствует данным. Мне также кажется, что мне придется переопределить свойство model для каждого маршрута.

Есть ли другой вариант, который лучше?

tl; dr: Как следует делиться данными между контроллерами?

ответ

3

Чтобы обмениваться данными с контроллерами, правильным способом было бы использовать needs API.

Предполагая, что у вашего CompaniesController есть все данные, которые вы хотите предоставить другим контроллерам, вы должны определить его через needs, это может быть простая строка или массив строк, если вы определяете более одного.

App.MyController = Ember.ObjectController.extend({ 
    needs: ['companies'], 
    myFunction: function() { 
    // now you can access your companies controller like this 
    this.get('controllers.companies'); 
    } 
}); 

Чтобы сделать вещи более легко доступны можно дополнительно определить привязку, например:

App.MyController = Ember.ObjectController.extend({ 
    needs: ['companies'], 
    companiesBinding: 'controllers.companies', 
    myFunction: function() { 
    // now you can access your companies controller like this 
    this.get('companies'); 
    } 
}); 

Надеется, что это помогает.

+0

Спасибо. Исходя из позвоночника, мне нелегко обернуть голову вокруг этого. Кажется, что контроллеры могут использоваться только для обмена данными; в позвоночнике, у меня будет коллекция 'company', доступ к которой может получить несколько просмотров. Короче говоря, целесообразно ли в ember создавать контроллер исключительно для хранения + совместного использования массивов моделей? –

+0

Если у вас есть такие данные, как «настройки приложения», то есть правильность настройки, которая не является составной частью комманды route/controller/view. Затем вы можете использовать API потребностей, чтобы ваши настройки были доступны другим контроллерам. Но если ваши данные связаны с деревом ресурсов, которые вы определили, то конкретный контроллер для каждого ресурса является лучшим подходом, вы все равно можете использовать все типы контроллеров жестко. – intuitivepixel

+0

Прошу прощения, я хочу что-то прояснить. @intuitivepixel Это работает в противоположном направлении? Индексный маршрут 'нуждается'? Нужно ли это «делать» поиск в контейнере или стрелки маршрута тоже? –

Смежные вопросы