Ember.js 为什么我的余烬观察器在它所依赖的计算属性之前触发?
如果我有一个只依赖于CP(“父”)的观察者(“子”),是否有任何理由会在父函数之前触发/运行子函数?这似乎就是我在更新家长所依赖的道具时看到的 更多详情:Ember.js 为什么我的余烬观察器在它所依赖的计算属性之前触发?,ember.js,Ember.js,如果我有一个只依赖于CP(“父”)的观察者(“子”),是否有任何理由会在父函数之前触发/运行子函数?这似乎就是我在更新家长所依赖的道具时看到的 更多详情: 观察者在('didInsertElement')上有。 模板(间接)使用父CP 在初始渲染时,我看到CP函数首先运行,然后是观察者 当更新CP所依赖的一个道具时,我看到观察者首先运行,然后是CP 当我说父CP被模板“间接”消耗时,我的意思是,实际上是在模板中直接消耗的父CP的两个依赖CP,而不是父CP本身。但是这两个函数都获取父CP,所以
- 观察者在('didInsertElement')上有
。
- 模板(间接)使用父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
}),
});
以下是初始渲染的顺序:
- 第一个孩子叫CPs
- 调用父对象(可能是在子对象获取父对象时)
- 调用第二个子级(并且似乎使用缓存的父级CP val)
- 母火观察员
someOtherProp
添加一个元素时,序列如下所示:
- 父CP观察员
- 父CP
- 儿童CP 1
- 儿童CP 2
(要明确的是,#2实际上并不令人惊讶,但只是我认为CPs的工作方式不同)正如@locks in the Ember slack向我解释的那样: 这是意料之中的,因为观察家们非常渴望:一旦他们的依赖关系所依赖的道具发生任何变化,他们就会立即开火 而且,因为在这种情况下,观察者访问父CP,它会导致它触发下一个。该结果被缓存,然后由两个子CP稍后使用