1

我有两个控制器,它们都加载到同一个插座,所以一次只能激活一个。两者都像这样观察第三个控制器上的属性:

App.SearchController = Ember.ObjectController.extend({
    needs: ['navigation'],

    updateResults: function () {
        console.log('load search data');
    }.observes('controllers.navigation.search')
});

完整样本

http://jsfiddle.net/FMk7R/1/

当属性更改时,会获取一些数据。如果我单击两个链接以加载两者,那么当属性更改时,两个控制器都会接收观察事件并加载数据。我只想将数据加载到可见的数据中。

如何确定哪个控制器当前处于活动状态并仅在活动控制器中加载数据?

4

1 回答 1

3

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

于 2013-02-18T19:44:54.977 回答