理想的には、コントローラーはそれらがアクティブであることを認識してはなりません。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/を参照してください
もう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/