У меня есть служба, которая управляет набором данных. Служба достаточно вежлива, чтобы предоставить варианты для возврата подмножества указанных данных на основе (какой бы логики она ни была, в этом примере она просто будет искать определенное значение атрибута данных). Сервис вернет массив совпадений. На мой взгляд, я хочу привязываться к этому набору совпадений. Однако, поскольку служба возвращает новый объект массива каждый раз при вызове функции фильтра, это не работает. Мое представление привязано к ранее возвращенному объекту массива.
Попробуйте эту скрипку:
var app = angular.module('app', []);
app.factory('MrData', function() {
var allData = [
{name: 'Adam', type: 'boy'},
{name: 'Kassidy', type: 'girl'},
{name: 'Justin', type: 'boy'},
{name: 'Chloe', type: 'cat'},
{name: 'D The P', type: 'dog'},
];
return {
add: function(thing) {
allData.push(thing);
},
fetchAll: function() {
return allData;
},
fetchForType: function(type) {
var some = [];
for (var i = 0; i < allData.length; i++) {
if (allData[i].type == type)
some.push(allData[i]);
}
return some;
}
}
});
app.controller('SomeCtrl', function($scope, MrData) {
$scope.showSome = MrData.fetchForType('boy');
$scope.showAll = MrData.fetchAll();
$scope.addBoy = function() {
MrData.add({name: 'TED!', type: 'boy'});
}
$scope.addOther = function() {
MrData.add({name: 'Other', type: 'Other'});
}
});
и вид:
<div ng-app="app">
<div ng-controller="SomeCtrl">
<button ng-click="addBoy()">Add Boy</button>
<button ng-click="addOther()">Add Other</button>
<h2>Boys</h2>
<ol>
<li ng-repeat="thing in showSome">
{{ thing.type }}
{{ thing.name }}
</li>
</ol>
<h2>All</h2>
<ol>
<li ng-repeat="thing in showAll">
{{ thing.type }}
{{ thing.name }}
</li>
</ol>
</div>
</div>
Вы можете видеть, что список мальчиков не обновляется, когда вы нажимаете «Добавить мальчика». И я понимаю, почему, но я не понимаю, как это исправить! Должен быть простой шаблон проектирования или функция, о которой я просто не знаю или не могу понять самостоятельно.
Заранее спасибо, Адам