Ember 2.5观察会话属性的变化

时间:2016-11-24 12:30:20

标签: session ember.js observers

我已经修补了路由器以将当前路由组件存储在会话变量中:

var Router = Ember.Router.extend({
    customSession: Ember.inject.service('session-custom'),
    location: config.locationType,

    didTransition: function() {
        this._super(...arguments);

        this.get('customSession').set('currentEntity', this.get('currentRouteName').split('.')[0]);
        this.get('customSession').set('currentDetailView', this.get('currentRouteName').split('.')[1]);

    }
});

我知道这不是最干净的解决方案,但是将会话写入控制台证明至少设置了这些参数。

在我的控制器中,我想听听这些参数的变化,但不知怎的,这不起作用:

import Ember from 'ember';
import ApplicationController from './application';

export default ApplicationController.extend({

    customSession: Ember.inject.service('session-custom'),

    currentRouteNameChanged: Ember.observer('customSession.currentEntity', function () {
        console.log("route changed");
    })
});

即。 “路径已更改”永远不会打印到控制台。

这似乎很容易解决,但我无法在SO上找到解决方案。

谢谢!

1 个答案:

答案 0 :(得分:0)

或许考虑使用initializersession-custom服务注入应用程序的控制器。为此,提出一些建议......

首先,在路由器和其他地方,使用传统的驼峰式短手注入您的服务,如下所示:

sessionCustom: Ember.inject.service(),

...请务必在代码中引用sessionCustom,而不是customSession

接下来,创建一个session-custom初始值设定项,并将服务注入应用程序的控制器:

export function initialize(application) {
  application.inject('controller', 'sessionCustom', 'service:session-custom');
}

export default {
  name: 'session-custom',
  initialize,
};

现在,从控制器观察路线变化应该是成功的:

export default Ember.Controller.extend({
  currentRouteNameChanged: Ember.observer(
    'sessionCustom.currentEntity', function() {
      console.log("CONTROLLER: ", this.get('sessionCustom.currentEntity'));
    }
  ),
});

当然,这些变化也可以从服务本身中看出:

export default Ember.Service.extend({
  currentEntity: '', // <-- it's helpful to explicitly declare

  currentRouteNameChanged: Ember.observer(
    'currentEntity', function() {
      console.log("SERVICE: ", this.get('currentEntity'));
    }
  ),
});

我已经创建了Ember Twiddle来演示此解决方案。