如何从ember.js中的另一个控制器更新控制器?

时间:2015-09-30 15:49:20

标签: ember.js

在我的应用程序中,我有一个公共标题,可以插入主应用程序布局。在该标题中,您可以选择一个站点。我需要该站点选择来更新在应用程序布局中呈现的另一个模板。经过几天的努力,我认为解决这个问题的正确方法是使用共享服务,让头控制器观察站点选择并在共享服务中设置该值,然后让索引控制器使用Ember .computed.alias对服务控制器中的值。以下是我的代码示例:

控制器/ header.js

import Ember from 'ember';

export default Ember.Controller.extend({
  sessionService: Ember.inject.service(),

  currentSiteChanged: Ember.observer('session.current_site', function(){
    var current_site = this.get('session.current_site');
    console.log('currentSiteObserver', current_site);
    this.get('sessionService').set('currentSite', current_site);
  }),

});

控制器/ index.js

import Ember from 'ember';

export default Ember.Controller.extend({
  sessionService: Ember.inject.service(),
  currentSite: Ember.computed.alias('sessionService.currentSite'),
  dashboardData: function(){
    var currentSite = this.get('currentSite');
    console.log("in dashboardData", currentSite);
    //other code that uses the currentSite
  }.property('currentSite'),
});

服务/会话service.js

import Ember from 'ember';

export default Ember.Service.extend({
  currentSite: null,

  setCurrentSite: function(){
    var currentSite = this.get('session.current_site');
    this.set('currentSite', currentSite );
  }.on('init'),
});

我认为这应该允许某人在标题中选择一个网站,并在索引更新中使用dashboardData属性来使用该选择。当页面最初将标头默认值加载到第一个站点并且索引呈现它具有必须从会话服务获得的正确站点值时,但是如果您选择另一个站点,则索引不会更新。通过console.logs和调试,我可以看到标头正在观察更改并在会话服务上设置值。

此外,我尝试解决其他方法(将头服务注入索引并观察属性,在头中注入索引并直接设置值,发送和侦听事件等)但我愿意尝试任何事情或要纠正,这不是解决问题的正确方法。

我正在使用ember 1.13.8并且暂时不会选择2。

1 个答案:

答案 0 :(得分:1)

我认为服务不是解决这个问题的合适方法。

您希望您的应用程序具有良好的RESTful url design(尊重网址是Ember框架的基石),因此请尝试在URL中捕获您的应用程序状态。

考虑到如果用户选择一个网站,然后点击刷新,他们将失去他们的选择,除非您以某种方式将其存储在cookie或localStorage中。

我建议使用路由或查询参数来解决您的问题。

<强>路线
使用路线非常简单(http://whatever.com/sites/pet-hampsters)。

查询参数
您还可以使用查询参数,例如http://whatever.com/?site=pet%20hampsters

要做到这一点,你会写一个action,它会冒泡到你的应用程序控制器并设置&#39; site&#39;的值。 queryParam。然后,当前活动路径上的任何子控制器都可以使用new Ember.inject syntax. This is the conventional way to manage dependencies between controllers读取站点值。