假设有一个角度自定义指令,它使用数组对象的隔离范围与双向绑定:
// scope values
this.scope = {
myArray: '='
};
所以,现在如果我要向数组中添加对象,一切都会像魅力一样:
myArray.push(item); // array in the parent scope will be updated
但是,当我尝试通过 slice 方法从数组中删除对象时,它将不起作用 - 数组将保持不变:
myArray.slice(itemIndex, 1); // ERROR: array will remain to be the same - item will not be deleted
基本上,slice会创建一个新的数组对象,据我所知,它是由angular禁止的。所以,问题是 - 通过双向数据绑定以及添加/删除对象的能力在范围之间传递数组的正确方法是什么?
编辑:非常感谢@ryanyuyu的正确答案和耐心解释。简而言之:答案 0 :(得分:1)
阅读self.node_3
的{{3}}:
Array.slice
不会改变。它返回原始数组中元素的浅表副本。
另外值得注意的是,第一个参数是起始索引,第二个参数是结束索引。要实际更改范围变量,您需要像这样分配返回值:
slice
更有可能的是,您希望直接操纵您的阵列。使用documentation( p 的拼接)从数组中删除元素。
myArray = myArray.slice(itemIndex, itemIndex+1);
答案 1 :(得分:0)
这是一种利用单向绑定的替代解决方案。你可以在Angular中避免双向绑定。他们比单程更贵。我正在添加它,因为它建立了对所涉及变量的牢固控制,并且它可能对探索这种类型的数据绑定的人提供信息。 (至少需要Angular 1.5)
.directive('myDirective', [function(){
return {
scope:{
myArray: '<',
onArrayUpdate: '&'
},
link: function(scope) {
scope.doThings = function(){
scope.onArrayUpdate({index_1: itemIndex, index_2: 1})
}
}
}
}])
.controller('myController', ['scope',function(scope){
scope.myArray = [];
scope.arraySlice = function(index_1, index_2) {
scope.myArray = scope.myArray.slice(index_1, index_2);//or whatever your intent is
}
}])
<my-directive my-array="myArray" on-array-slice="arraySlice(index_1, index_2)"></my-directive>
答案 2 :(得分:-1)
尝试更改此内容:
myArray.slice(itemIndex, 1);
到此:
myArray = myArray.slice(itemIndex, 1);
它应该有用。