cou*_*ing 6 javascript ember.js
我想我不是在理解这个概念.据我所知,任何人Ember.object都可以观察到另一个人的属性Ember.object.
所以,我有一个服务,一个路由器和一个组件.我需要组件和路由器才能观察服务上的属性.完全有可能我只是以错误的方式构建解决方案,我将概述我最后要做的事情.
这是我的大概:
export default Ember.Service.extend({
observedProperty: 'original value'
});
Run Code Online (Sandbox Code Playgroud)
export default Ember.Component.extend({
thingManager: Ember.inject.service(),
myObserver: Ember.observer(
'thingManager.observedProperty',
function() {
// This shows up as anticipated, unlike the one in the routes
console.log('THING SHOWER COMPONENT observed change on thingManager')
}
),
actions: {
changeObservedProperty: function() {
let thingManager = this.get('thingManager')
let newText = thingManager.get('observedProperty') + '!'
// here i am sure to call `set` to make sure observers fire
thingManager.set('observedProperty', newText)
}
}
});
Run Code Online (Sandbox Code Playgroud)
export default Ember.Route.extend({
thingManager: Ember.inject.service(),
underObservation: Ember.observer('thingManager.observedProperty', function() {
// This is what I expect to fire, but does not.
console.log('THINGS ROUTE observed change on thingManager')
}),
});
Run Code Online (Sandbox Code Playgroud)
如您所见,我期待组件和路由器中的两个观察者的控制台输出.为什么这不起作用?
这可能是一个单独的问题,但我想知道是否有更好的方法来完成我想要做的事情.我一直在学习'数据下降,行动起来',这让我采用了这种方法.我正在建立一个网站,用一堆GPS坐标加载一个json文件并将它们粘贴在地图上.
目标是单击地图标记,并加载相应的数据.这也应该改变路线.因此,我的想法是,在服务中跟踪我的标记,并且当所选标记发生变化时,路由器将观察到并转换到下一个路径.该组件还会注意到已更改的属性并更新地图.
谢谢大家!
在things.js路由文件中,您没有使用访问/使用过的 thing-manager服务,因此不会触发观察者。
路线/thing.js
init(){
this._super(...arguments);
this.get('thingManager');
},
Run Code Online (Sandbox Code Playgroud)
引入这个会让你的观察者被解雇。
我会说,如果您遵循 DDAU 原则,那么您的组件不应改变事物管理器服务属性。它应该向服务发送操作并对其进行变异。
注意:您可以在任何 Ember.Object 中拥有观察者和计算属性,这意味着您也拥有它的事物管理器服务。