Javascript 为什么';t AngularJS$onChanges注意到数组已更改吗? 为什么angular没有注意到数组已更改,但如果我先将其更改为null,它会更改吗?

Javascript 为什么';t AngularJS$onChanges注意到数组已更改吗? 为什么angular没有注意到数组已更改,但如果我先将其更改为null,它会更改吗?,javascript,angularjs,Javascript,Angularjs,我有一个AngularJS组件,它通过单向双向(=)数据绑定接受数组。在父级中,我有一个按钮,其ng click映射到此函数: onClickAddValue() { this.listOfValues.push(this.valueInput); } 其中this.listOfValues是通过绑定传递给子组件的内容。此代码无效(子组件的视图未更新)。作为一个事先做了AngularJS作业的聪明人,我知道这是因为listOfValues的值没有改变,它仍然是相同的对象引用。所以我这

我有一个AngularJS组件,它通过单向双向(
=
)数据绑定接受数组。在父级中,我有一个按钮,其ng click映射到此函数:

onClickAddValue()
{ 
    this.listOfValues.push(this.valueInput);
}
其中
this.listOfValues
是通过绑定传递给子组件的内容。此代码无效(子组件的视图未更新)。作为一个事先做了AngularJS作业的聪明人,我知道这是因为
listOfValues
的值没有改变,它仍然是相同的对象引用。所以我这样做:

onClickAddValue()
{ 
    var oldList = this.listOfValues;
    this.listOfValues = [];
    for (let value of oldList)
    {
        this.listOfValues.push(value);
    }
    this.listOfValues.push(this.valueInput);
}
但那也不行!我还尝试了
Object.assign
angular.copy
。就好像我的子组件根本没有注意到其输入的任何更改。但很明显,它确实如此,因为下面的代码确实有效

onClickAddValue()
{ 
    var oldList = this.listOfValues;
    this.listOfValues = null;
    setTimeout(
        () =>
        {
            this.listOfValues = oldList;
            this.listOfValues.push(this.valueInput);
            this.$scope.$digest();
        }
    );  
}
发生什么事了?我可以理解为什么最后一个代码段可以工作-
listOfValues
被设置为null,
ng click
会自动触发摘要,并注意到新的null值,因此它会更新视图,然后一瞬间,
listOfValues
再次更改,手动触发另一个摘要,视图再次更新。但是为什么另一个版本不起作用呢?为什么更改对象不同于将其更改为null,然后再更改它

我正在收听对
$onChanges

用于创建将由
$onChanges
检测到的新对象:

  onClickAddValue()
  { 
    this.listOfValues.push(this.valueInput);
    this.listOfValues = this.listOfValues.concat();
  }
$onChanges
仅检查引用更改。它不检查内容更改。使用
数组更改内容后。按
。使用
Array.concat
方法创建一个将由变更检测器检测的新对象

角度模块(“应用程序”,[]) .controller(“ctrl”,类{ 构造函数(){ this.listOfValues=[3,5]; } onClickAddValue() { this.listOfValues.push(this.valueInput); this.listOfValues=this.listOfValues.concat(); } }) .component(“myComponent”{
绑定:{值:"您是如何使用组件中的数组的?您是在模板中使用
$ngChange
?还是在模板中使用
ng repeat
?@georgeawg对延迟表示抱歉。在子组件中,我正在收听对
$onChanges
中绑定的
列表值的更改。如果您从一开始就说您使用的是双向(
=
)绑定,而不是错误地说您使用的是单向绑定。双向(=)应该避免绑定,因为它增加了一个额外的观察者,并且使迁移到Angular 2+更加困难。有关更多信息,请参阅。@georgeawg我说这是文章第一行中的双向绑定。检查编辑。您最初的问题是“单向绑定”。我将问题编辑为“双向绑定”使它对其他读者有用。正如我所说,我知道您需要更改实际的对象引用-这就是为什么我在OP中使用for循环尝试了所有第二个片段。它仍然不起作用(而且
Array.concat
).在做了更多的尝试之后,我认为这实际上与以下事实有关:
listOfValues
是通过
=
绑定而不是
@JackM绑定到子组件的。
$ngChanges
的文档清楚地说明了它使用属性(
'@'
)和单向(
'