我的目標是將一個輸出數組的teacher-id(f_teacher)替換爲另一個數組的老師名稱。我寫了一個自定義過濾器,是應該做的工作:'ng-repeat'上的自定義過濾器會覆蓋範圍
angular.module('core')
.filter('replaceId', function() { //filter, which replaces Id's of one array, with corresponding content of another array
return function (t_D, s_D, t_prop, s_prop) { //data of target, data of source, target property, source property
var replacment = {};
var output = [];
angular.forEach(s_D, function (item) {
replacment[item.id] = item[s_prop]; //replacment - object is filled with 'id' as key and corresponding value
});
angular.forEach(t_D, function (item) {
item[t_prop] = replacment[item[t_prop]]; //ids of target data are replaced with matching value
output.push(item);
});
return output;
}
});
我使用的是「NG重複」是這樣的:
<tr ng-repeat="class in $ctrl.classes | filter:$ctrl.search | replaceId:$ctrl.teachers:'f_teacher':'prename' | orderBy:sortType:sortReverse">
<td>{{class.level}}</td>
<td>{{class.classNR}}</td>
<td>{{class.f_teacher}}</td>
</tr>
但它只能輸出一個空列。現在奇怪的是:如果我按照調試器的步驟進行操作,它將在第一次執行過濾器時起作用。但是當它再次執行時,它會輸出一個空列。
我注意到過濾器的返回對象覆蓋了$ ctrl.classes - 數組,但通常情況下不應該如此?
這裏是一個plnkr: https://plnkr.co/edit/EiW59gbcLI5XmHCS6dIs?p=preview
這究竟是爲什麼?
感謝您的時間:)
可以重現該問題在plunker?你的過濾器直接在'$ ctrl.classes'中的對象上設置字段。如果你不希望它改變'$ ctrl.classes',那麼你可以做一些類似'angular.copy()'的對象。 – rob
我添加了一個plnkr(見上文)。好的,但我使用了其他自定義過濾器,這些自定義過濾器的工作原理相同(修改數組並返回修改後的數組)並且不覆蓋範圍。爲什麼這個自定義過濾器會這樣做? – JoCa