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