在Angular中使用双向数据绑定在范围之间传递数组的正确方法是什么?

时间:2016-09-22 17:50:57

标签: javascript angularjs

假设有一个角度自定义指令,它使用数组对象的隔离范围与双向绑定:

// 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的正确答案和耐心解释。简而言之:

  • 这个问题与Angular没有任何共同之处,还有vanilla JavaScript API。
  • 仔细阅读文档,因为有时一个角色真的很重要; - )

3 个答案:

答案 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);

它应该有用。