2016-02-26 54 views
1

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

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

有没有办法解决这个问题,并使其工作?我的指令

相关相提并论:

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

<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> 
+0

组= group.filter()似乎并不正确,你可以尝试声明组变量的指令级不是函数作用域。 –

回答

0

这与Java脚本如何处理引用办的相关相提并论。 AngularJS严重依赖他们正确地做事。防止中断引用的最佳经验法则是始终对对象/变量的属性进行更改,而不是变量本身。 Here's another perspective on your issue.

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> 
+0

_可以重复使用该函数与其他数组_这种方式不是通用的,不能用于其他数组。 – Ties

+0

谢谢,我想我可以从中计算出来=) –

1

问题是你要重新分配变量group。当函数启动时,groupschoolList有相同的对象,但是当您做group = group.filter...时,您正在创建一个新阵列,并且引用group,因此对它的任何更改都不会链接到schoolList。当函数结束时,你不用做任何事情,所以和没有做任何事情一样。

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

1

要做到这一点,你需要修改则传递到addItem组阵列,如用splice

说,像这样(未经):

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 
     } 
    } 
}; 
相关问题