Javascript 角传递变量作为参数的函数,并在

Javascript 角传递变量作为参数的函数,并在,javascript,angularjs,Javascript,Angularjs,我遇到了以下问题:我需要将schoolList作为参数传递给ngClick函数(以便可以将该函数与其他数组一起重用)。但是,当我尝试在函数中使用“group”局部变量处理数组时,它不会更新数组本身 如果我在函数中使用'scope.schoolsList'而不是'group',则一切正常 有没有办法解决这个问题并使其发挥作用 我的指令的相关PAR: link: { scope.schoolsList = [ 'item 1',

我遇到了以下问题:我需要将schoolList作为参数传递给ngClick函数(以便可以将该函数与其他数组一起重用)。但是,当我尝试在函数中使用“group”局部变量处理数组时,它不会更新数组本身

如果我在函数中使用'scope.schoolsList'而不是'group',则一切正常

有没有办法解决这个问题并使其发挥作用

我的指令的相关PAR:

link: {
            scope.schoolsList = [
                'item 1',
                'item 2',
                'item 3',
                'item 4',
            ];

            scope.addItem = function(obj, array, group){
                array.push(obj);

                group = group.filter(function(list){
                    return list !== obj;
                });

            };
            scope.removeItem  = function($index, group){
                group.push(scope.newData.schools[$index]);
                scope.newData.schools.splice($index,1);
                console.log(scope.newData.schools);
            }
        }

HTML的相关PAR

<select id="newSchool" name="newSchool" ng-model="newSchool" ng-options="school for school in schoolsList | orderBy:school">
    <option value="" hidden>-- Select --</option>
</select>
<a ng-click="addItem(newSchool, newData.schools, schoolsList)">add</a>
<ul class="list-inline">
    <li ng-show="newData.schools.length > 0">
        <ng-pluralize count="newData.schools.length" 
                      when="{'0': '','one': 'School: ','other': 'Schools: '}">
        </ng-pluralize>
    </li>
    <li ng-repeat="school in newData.schools">
        <span>{{ school }}</span>
        <a ng-click="removeItem($index, schoolsList)">[X]</a>
    </li>
</ul>

--挑选--
添加
  • {{学校} [X]

这与Javascript处理引用的方式有关。AngularJS非常依赖他们来正确地做事。防止中断引用的最佳经验法则是始终更改对象/变量的属性,而不要更改变量本身

链接:{
scope.data.schoolsList=[
“项目1”,
“项目2”,
“项目3”,
“项目4”,
];
scope.addItem=函数(对象、数组、组){
阵列推送(obj);
group.schoolList=group.schoolList.filter(函数(列表){
返回列表!==obj;
});
};
scope.removietem=函数($index,group){
group.schoolList.push(scope.newData.schools[$index]);
范围.newData.schools.splice($index,1);
console.log(scope.newData.schools);
}
}
--挑选--
添加
  • {{school}[X]

问题是您正在重新分配变量
。当函数启动时,
group
引用了与
schoolList
相同的对象,但是当您执行
group=group.filter…
时,您正在创建一个新数组,并引用
group
,因此对它的任何更改都不会链接到
schoolList
。当函数结束时,您不会对其执行任何操作,这与不使用它是一样的


我不清楚您的指令的用途,但是如果您想重用整个指令,您应该为集合定义一个具有双向绑定的隔离作用域。如果您不想重复使用整个指令,而只想重复使用单个功能,请提供有关指令本身用途的更多信息。

为此,您需要修改传递到
addItem
中的组数组,例如使用
splice

比如,类似这样的(未经测试):

scope.addItem=函数(对象、数组、组){
阵列推送(obj);
对于(var i=0;it)可以通过这种方式在其他数组中重复使用该函数,因为它不是泛型的,不能用于其他数组。group=group.filter()似乎不正确,您可以尝试在指令级别声明组变量,而不是函数作用域。
link: {
        scope.data.schoolsList = [
            'item 1',
            'item 2',
            'item 3',
            'item 4',
        ];

        scope.addItem = function(obj, array, group){
            array.push(obj);

            group.schoolList = group.schoolList.filter(function(list){
                return list !== obj;
            });

        };
        scope.removeItem  = function($index, group){
            group.schoolList.push(scope.newData.schools[$index]);
            scope.newData.schools.splice($index,1);
            console.log(scope.newData.schools);
        }
    }


<select id="newSchool" name="newSchool" ng-model="newSchool" ng-options="school for school in data.schoolsList | orderBy:school">
    <option value="" hidden>-- Select --</option>
</select>
<a ng-click="addItem(newSchool, newData.schools, data)">add</a>
<ul class="list-inline">
    <li ng-show="newData.schools.length > 0">
        <ng-pluralize count="newData.schools.length" when="{'0': '','one': 'School: ','other': 'Schools: '}"></ng-pluralize>
    </li>
    <li ng-repeat="school in newData.schools"><span>{{school}} </span> <a ng-click="removeItem($index, data)">[X]</a></li>
</ul>
scope.addItem = function(obj, array, group){
    array.push(obj);

    for(var i=0; i<group.length; i++) {
        if(group[i] !== list) {
            group.splice(i, 1); // splice modifies the array
            i--; // need to check spot 'i' again
        }
    }
};