2013-02-18 60 views
1

我有两个控制器都加载到同一个插座,所以一次只能启动一个控制器。两个这样的第三控制器上观察一个属性:如何知道哪个控制器加载到插座

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

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

全部样品

http://jsfiddle.net/FMk7R/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/

+0

您提到,我可以颠倒的关系,我该怎么办呢?我的意思是如何在NavigationController中获得主动控制器? – 2013-02-18 20:10:39

+0

'需要:['active']'在NavigationController中,然后你有'controllers.active'。 – Wildhoney 2013-02-18 20:12:15

+0

在'NavigationController'上定义一个属性(例如'active'),该属性由'SearchRoute'和'ImagesRoute'上的setupController钩子设置,例如:'this.controllerFor('navigation')。set('active',controller );' - 那么你可以在'NavigationController'中观察搜索字段的变化,并且在任何控制器处于活动状态时调用适当的方法。 – 2013-02-18 20:32:03

相关问题