如何通过Angular中的HTML方法调用来改变JS文件中的数组?

时间:2017-11-14 20:47:51

标签: javascript arrays angularjs

我正在使用Angular.js并尝试清除首先实例化并保存在我的模块上的数组:

 angular.module(myApp)
  .controller('myCtrl', function ($rootScope){
    var vm = this;

    vm.myArr = ["Clear", "Me"]

    vm.clearer = function(arr) {
       arr = [];
    };

    vm.copier = function(arrToOverwrite, arrToCopy) {
        arrToOverWrite = angular.copy(arrToCopy);
   };

我从我的HTML文件中调用此方法:

    (controller myCtrl is aliased as ctrl)
    <input type="button" ng-click="ctrl.clearer(ctrl.myArr)" value="clear">

然而,在JS中,它强调arr,表示该值从未使用过。并且,假设我总是在HTML中显示myArr的值,它不受更改的影响。我认为,因为JS是通过引用传递的,如果myArr作为clearer方法中的引用传递,如果它在那里得到更新,那么它将随地用该值更新?

我该怎么做?我需要在其他位置使用clearer方法在其他数组上,其他数组可能在其他时间在JS文件中保存在“内存中”。

1 个答案:

答案 0 :(得分:2)

当您调用该函数时,您为arr param分配了对ctrl.myArr的引用。使用表达式arr = [],您可以指定arr来引用空数组,但ctrl.myArr仍然指向原始数组。

在这种情况下,您需要通过将长度更改为0来直接改变数组,例如:

&#13;
&#13;
var array = [1, 2, 3];

var clearer = function(arr) {
  arr.length = 0;
};

clearer(array);

console.log(array);
&#13;
&#13;
&#13;

如果您需要删除某些项目或添加新项目,可以使用Array#spliceangular.copy()用另一个项目覆盖该数组:

&#13;
&#13;
var array = [1, 2, 3, 4, 5, 6, 7];
var replacement = [9, 10, 11];

function copier(arrToOverwrite, arrToCopy) {
  arrToOverwrite.splice(0, arrToOverwrite.length, ...arrToCopy); // or angular.copy(arrToCopy, arrToOverwrite)
};

copier(array, replacement);

console.log(array);
&#13;
&#13;
&#13;