理想情况下,您的控制器不应该知道它们处于活动状态。一种替代方法是反转关系,以便 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/
http://jsfiddle.net/FMk7R/1/