如何确定我的活跃计算值是否已更改

how to determine if my ractive computed value has changed

对于我的布局,我有一个组件需要在渲染完成后进行初始化,然后在我的数据发生任何变化时再次进行初始化。

这会很好用,但我依赖计算值来为每个客户端过滤和更改输出,并且通过 observe 经常触发更改事件。我的工作:

let myRactive = new Ractive({
    el: '#clientContainer',
    template: myTemplate,
    magic: true,
    modifyArrays: true,
    data: {data}, //=> this is an awful lot of Data changing all the Time
    computed: {
        usefulData(){
           let tempdata = this.get('data');
           //=> a lot of rearranging, filtering and sorting 
           //   to adapt the data only for this specific client
           return tempdata;
        }
   onrender: function () {
        initmyLayoutComponent()
    }
    });

所以我试着这样弄

myRactive .observe( 'usefulData', function ( newValue, oldValue, keypath)
    destroymyLayoutComponent();
    initmyLayoutComponent();
});

但这会触发 a) 每当 data 中的 任何东西 发生变化时(即使它与 usefulData 完全无关),以及 b) 之前ractive 已经渲染了 DOM 所以组件会提前重新初始化。

有没有办法只观察计算值,或者 - 这会更好 - 只观察计算值中的特定动作(比如我想对 added/deleted 对象做出反应,但不改变值)?

好吧,您可以做的是实际将 clientData obj 发送到模板中,然后只收听该数据。

let myRactive = new Ractive({
  el: '#clientContainer',
  template: '<div>{{clientData.name}}</div><input type="text" value="{{clientData.name}}" /><div>{{email}}</div><input type="text" value="{{email}}" /><div>Clientdata changed: {{cnt}}</div>',
  magic: true,
  modifyArrays: true,
  data: {
    name: 'hallo',
    email: 'a@a.com',
    cnt: 0
  }, //=> this is an awful lot of Data changing all the Time
  computed: {
    usefulData() {
      let tempdata = this.get('name');
      // Create your own data obj
      tempdata = {
        name: 'world'
      };
      // set it to the ractive context
      this.set('clientData', tempdata);
    }
  },
  oninit: function() {
    this.observe('clientData', function(newValue, oldValue, keypath) {
      let cnt = this.get('cnt')
      cnt += 1;
      this.set('cnt', cnt);
      console.log('listen only to the computed data');
    }, {init: false});
    this.get('usefulData');
  },
  onrender: function() {
    // do something
  },
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/ractive/0.9.0-build-123/ractive.min.js"></script>
<div id="clientContainer"></div>