У меня есть два контроллера, которые загружаются в одну розетку, поэтому одновременно может быть активен только один. Оба наблюдают такое свойство третьего контроллера:
App.SearchController = Ember.ObjectController.extend({
needs: ['navigation'],
updateResults: function () {
console.log('load search data');
}.observes('controllers.navigation.search')
});
Полный образец
При изменении свойства извлекаются некоторые данные. Если я щелкну по обеим ссылкам, и обе будут загружены, то при изменении свойства оба контроллера получат событие наблюдения и загрузят данные. Я хочу загружать данные только в ту, которая видна.
Как я могу определить, какой контроллер в данный момент активен, и загрузить данные только в активный?
1 ответ
В идеале ваши контроллеры не должны знать, что они активны. Одна альтернатива - инвертировать отношение, чтобы NavController отвечал за изменение свойства запроса «активного» контроллера.
** ОБНОВЛЕНИЕ - добавление примера на основе комментария **
App.SearchRoute = Ember.Route.extend({
setupController: function(controller) {
this.controllerFor('navigation').set('active', controller);
}
});
App.ImagesRoute = Ember.Route.extend({
setupController: function(controller) {
this.controllerFor('navigation').set('active', controller);
}
});
App.SearchController = Ember.ObjectController.extend({
loadResults: function (query) {
console.log('loading web search data for: ', query);
}
});
App.ImagesController = Ember.ObjectController.extend({
loadResults: function (query) {
console.log('loading image search data for: ', query);
}
});
App.NavigationController = Ember.ObjectController.extend({
search: '',
active: null,
searchDidChange: function() {
this.get('active').loadResults(this.get('search'));
}.observes('search', 'active')
});
См. http://jsfiddle.net/F3uFp/1/.
Другой альтернативой является использование вместо этого вычисляемых свойств. Ember обновит только вычисленные свойства, которые действительно необходимы для рендеринга активного представления. Например:
App.SearchController = Ember.ObjectController.extend({
needs: ['navigation'],
results: function () {
console.log('loading web search data');
return("web search results");
}.property('controllers.navigation.search')
});
См. Обновленную скрипку здесь: http://jsfiddle.net/ZTnmp/
Похожие вопросы
Новые вопросы
ember.js
Ember.js - это фреймворк для приложений с компонентами, написанный на JavaScript. Попробуйте облегчить ответ на свой вопрос с помощью предварительно настроенных шаблонов, упомянутых в вики этого тега. (Всегда указывайте версию ember, используемую при описании вашей проблемы)
needs: ['active']
вNavigationController
, а затем у вас естьcontrollers.active
.NavigationController
, которое устанавливается из обработчика setupController наSearchRoute
иImagesRoute
, например:this.controllerFor('navigation').set('active', controller);
- тогда вы можете наблюдать изменения в поле поиска изNavigationController
и вызовите соответствующие методы на любом активном контроллере.needs: ['active']
у меня не работал. Я пробовал это: jsfiddle.net/ZTnmp/2