理想情况下,您的控制器不应该知道它们处于活动状态。一种替代方法是反转关系,以便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/
您提到,我可以颠倒的关系,我该怎么办呢?我的意思是如何在NavigationController中获得主动控制器? – 2013-02-18 20:10:39
'需要:['active']'在NavigationController中,然后你有'controllers.active'。 – Wildhoney 2013-02-18 20:12:15
在'NavigationController'上定义一个属性(例如'active'),该属性由'SearchRoute'和'ImagesRoute'上的setupController钩子设置,例如:'this.controllerFor('navigation')。set('active',controller );' - 那么你可以在'NavigationController'中观察搜索字段的变化,并且在任何控制器处于活动状态时调用适当的方法。 – 2013-02-18 20:32:03