AngularJS 1.6 - $ onChanges执行两次

时间:2017-08-25 18:49:09

标签: javascript angularjs angular-digest

我可能过度思考这就是为什么我在这里。 :)

注意:在以下示例中,对象“ctrl”是组件的控制器别名。 var ctrl = this;

假设我们有一个包含两个绑定的组件,其中一个是可选的:

$ curl -X POST -H "Authorization: Bearer XXX" \
"https://www.googleapis.com/upload/storage/v1/b/BUCKET/o/rdf.ads/rewriteTo/b/BUCKET/o/xxx"
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "badContent",
    "message": "Unsupported content with type: application/octet-stream"
   }
  ],
  "code": 400,
  "message": "Unsupported content with type: application/octet-stream"
 }
}

有时公司是可用的,有时则不然。

$ onChanges看起来像:

bindings: { 
   params: '<', 
   company: '<?' 
}

似乎当两个绑定都更新时,$ onChanges会运行两次。第一次,ctrl.company(绑定)在组件中为null,即使我确实使用值更新了该绑定。第二次,ctrl.company有它的值。

现在,我知道OR操作可能不正确。我只是不确定$ onChanges如何运作。

如果我对问题的描述不清楚,我会更新。

提前致谢。

1 个答案:

答案 0 :(得分:2)

From Angular code:

  

$onChanges(changesObj) - 每当更新单向(<)或插值(@)绑定时调用。该    * changesObj是一个哈希,其键是已更改的绑定属性的名称,值为a    * { currentValue, previousValue, isFirstChange() }形式的对象。使用此挂钩来触发a中的更新    *组件,如克隆绑定值,以防止外部值的意外突变。

因此,根据我的观点,您有2个绑定项:paramscompany导致$onChanges触发两次。

如果你想写一次日志,我会写&&

if (changes.params && changes.company) {
    console.log('executed');
 }