为什么我的Ember Observer在它所依赖的计算属性之前触发?

时间:2017-10-26 04:35:40

标签: ember.js

如果我有一个仅依赖于CP(“父”)的观察者(“孩子”),是否有任何理由在父母之前触发/运行子函数?当我更新父母依赖的道具之一时,这似乎就是我所看到的......

更多细节:

  • 观察者有.on('didInsertElement')
  • 父CP由模板(间接)消耗
  • 在初始渲染时,我看到CP函数先运行,然后是观察者
  • 在更新CP依赖的其中一个道具时,我看到观察者首先运行,然后是CP

当我说模板“间接”消耗父CP时,我的意思是它实际上是父CP的两个相关CP,它们直接在模板中使用,而不是父本身。但是这两个函数都获取父CP,所以我很确定它应该具有相同的效果 - 在初始渲染期间首先消耗父CP

这是一个有希望制作的组件的简化示例 这更清楚一点:

import Ember from 'ember';

 export default Ember.Component.extend({
  didInsertElement() {
    console.log('didInsertElement called');
  },
  didRender() {
    console.log('didRender called');
  },
  parentCP: Ember.computed('someOtherProp.[]', function() {
    console.log('called parentCP')
    return something;
  }),
  myObserver: function() {
    console.log('called observer');
    this.get('parentCP');
    // ... do something
  }.observes('parentCP').on('didInsertElement'),
  childCP1: Ember.computed('parentCP', function() {
    console.log('called child CP 1');
    this.get('parentCP');
    // ... compute
  }),
  childCP2: Ember.computed('parentCP', function() {
    console.log('called child CP 2');
    this.get('parentCP');
    // ... compute
  }),
});

这是初始渲染的序列:

  • 第一个子CP被称为
  • 父母被召唤(大概是当孩子取得它时)
  • 第二个孩子被调用(并且似乎使用缓存的父CP val)
  • 父母的观察员开火

(这基本上是我所期待的)

但是,当我向someOtherProp添加元素时,序列如下所示:

  • 父母CP的观察员
  • parent CP
  • 儿童CP 1
  • child CP 2

这是预期的吗?特别是两件事:

  1. 无序观察员射击真的很令人惊讶
  2. 我认为父母和子女CP的顺序与以前相同(即父母CP不会被重新计算,直到其中一个孩子取得它),但似乎它被重新计算得非懒惰地
  3.  (很明显,#2实际上并不令人惊讶,但不是我认为CP的工作原理)

1 个答案:

答案 0 :(得分:2)

正如@locks在Ember懈怠中向我解释的那样:

这是预料之中的,因为观察者都很渴望:一旦对其依赖关系所依赖的道具进行任何更改,它们就会立即触发

并且,因为在这种情况下,Observer访问父CP,它会导致它接下来触发。该结果被缓存,然后由两个子CP使用