我已经修补了路由器以将当前路由组件存储在会话变量中:
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上找到解决方案。
谢谢!
答案 0 :(得分:0)
或许考虑使用initializer将session-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来演示此解决方案。