从 EmberJS 中的路线观察服务上的属性

2024-01-19

我想我不理解这里的概念。据我所知有任何Ember.object可以观察另一个人的属性Ember.object.

所以,我有一个服务、一个路由器和一个组件。我需要组件和路由器能够观察服务的属性。我完全有可能只是以错误的方式构建解决方案,我将在最后概述我想要做的事情。

这大约是我所拥有的:

/services/thing-manager.js

export default Ember.Service.extend({
  observedProperty: 'original value'
});

/components/thing-shower.js

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)
   }
 }

});

/routes/things.js

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')
  }),
});

正如您所看到的,我期待组件和路由器中的两个观察者的控制台输出。为什么这不起作用?

我的总体目标

这可能是一个单独的问题,但我想知道是否有更好的方法来完成我想做的事情。我一直在学习“数据下降,行动上升”,这使我采用了这种方法。我正在构建一个网站,该网站加载带有一堆 GPS 坐标的 json 文件并将它们粘贴在地图上。

目标是单击地图标记,然后加载相应的数据。这也应该改变路线。所以,我的想法是,跟踪服务中的标记,当选定的标记发生变化时,路由器会观察到这一情况并转换到下一个路由。该组件还会注意到更改的属性并更新地图。

谢谢各位!


In things.js您未使用过的路由文件已访问/使用过thing-manager服务,因此观察者不会被触发。

路线/thing.js

init(){
    this._super(...arguments);
    this.get('thingManager');
},

引入这一点会让你的观察者被解雇。

我想说,如果您遵循 DDAU 原则,那么您的组件不应改变事物管理器服务属性。它应该向服务发送操作并改变它。

注意:您可以在任何 Ember.Object 中拥有观察者和计算属性,这意味着您也拥有事物管理器服务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 EmberJS 中的路线观察服务上的属性 的相关文章

随机推荐