如何知道插座中装入了哪个控制器

时间:2013-02-18 19:16:14

标签: ember.js

我有两个控制器都加载到同一个插座,因此一次只能激活一个。两者都在第三个控制器上观察属性,如下所示:

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

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

完整样本

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

当属性发生变化时,会获取一些数据。如果我单击这两个链接以便加载它们,那么当属性更改时,两个控制器都会收到observes事件并加载数据。我想只在可见的数据中加载数据。

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

1 个答案:

答案 0 :(得分: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/