Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 为什么我的余烬观察器在它所依赖的计算属性之前触发?_Ember.js - Fatal编程技术网

Ember.js 为什么我的余烬观察器在它所依赖的计算属性之前触发?

Ember.js 为什么我的余烬观察器在它所依赖的计算属性之前触发?,ember.js,Ember.js,如果我有一个只依赖于CP(“父”)的观察者(“子”),是否有任何理由会在父函数之前触发/运行子函数?这似乎就是我在更新家长所依赖的道具时看到的 更多详情: 观察者在('didInsertElement')上有。 模板(间接)使用父CP 在初始渲染时,我看到CP函数首先运行,然后是观察者 当更新CP所依赖的一个道具时,我看到观察者首先运行,然后是CP 当我说父CP被模板“间接”消耗时,我的意思是,实际上是在模板中直接消耗的父CP的两个依赖CP,而不是父CP本身。但是这两个函数都获取父CP,所以

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

更多详情:

  • 观察者在('didInsertElement')上有
  • 模板(间接)使用父CP
  • 在初始渲染时,我看到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
  }),
});
以下是初始渲染的顺序:

  • 第一个孩子叫CPs
  • 调用父对象(可能是在子对象获取父对象时)
  • 调用第二个子级(并且似乎使用缓存的父级CP val)
  • 母火观察员
(这基本上是我所期望的)

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

  • 父CP观察员
  • 父CP
  • 儿童CP 1
  • 儿童CP 2
这是预期的吗?特别是两件事:

  • 无序的观察者开火真是令人惊讶
  • 我本以为父级CP和子级CP的顺序与以前相同(即父级CP在其中一个子级获取之前不会被重新计算),但它似乎是非惰性地重新计算的
  • 
    (要明确的是,#2实际上并不令人惊讶,但只是我认为CPs的工作方式不同)

    正如@locks in the Ember slack向我解释的那样:

    这是意料之中的,因为观察家们非常渴望:一旦他们的依赖关系所依赖的道具发生任何变化,他们就会立即开火

    而且,因为在这种情况下,观察者访问父CP,它会导致它触发下一个。该结果被缓存,然后由两个子CP稍后使用