regularjs/regular

v0.5.2的watcher新增stable特性后,computed计算过程中的数据变化未触发update

Closed this issue · 1 comments

#128 的优化中引入了该问题,具体如下。

$watch方法中设置stable选项,可以让确定不会引发数据变化的watcher在数据稳定后检查,以提升性能;而walker中,对模版内的表达式设置watcher默认使用了stable选项。

walkers.expression = function(ast, options){
  var node = document.createTextNode("");
  this.$watch(ast, function(newval){
    dom.text(node,  newval == null? "": String(newval) );
  }, OPTIONS.STABLE_INIT )        // here
  return node;
}

计算属性computed也包含在了里面,因此在计算属性get方法执行中引起的数据变化不会触发update。

computed: {
  errMsg () {
    // ...
    this.data.success = false;
    return 'error msg';
  }
}

这点会大概率影响老的业务代码。要求开发者在计算属性中避免引起数据变化不太现实,所以看能不能对计算属性做一下特殊处理。

这个点疏忽了, 但实际上,get操作是不应该有side effect的,不仅仅包括计算字段,比如你调用一个get 方法也是如此。 这个过去的文档都未曾提及 。 可能会考虑在文档中进行处理, 如果真要做修复操作,应该自行对字段进行watch 并进行主动修改。 也是所谓读写分离 (因为,get的调用次数是不受开发者控制,而是统一由Regular处理,你无法预计系统会在何时调用get,如果在get中掺杂set操作,这个本身就是不好的做法。)