2016-02-26 57 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 
     } 
    } 
}; 
相關問題