Я пытаюсь «контролировать» данные на фабрике с двух отдельных контроллеров, и хотя приведенный ниже код работает нормально, он не всегда работает. По какой-то причине он связывает данные только примерно в 50% случаев. Есть ли способ убедиться, что данные привязываются все время, и если какой-либо контроллер вносит изменения в данные, эти изменения будут отражены на обоих концах.
Обслуживание:
angular.module('service', ['ngResource']).
factory('Service', function($resource){
return $resource('/api/data/:id', {id:'@id'}, {});
});
Фабрика:
angular.module('factory', ['ngResource', 'service']).
factory('Factory', function($resource, Service) {
this.mydata = '';
return {
getData: function(id){
return Service.query({id: id});
},
data: function(data){
return this.mydata;
},
setData: function(data){
this.mydata = data;
}
}
});
Контроллер:
$scope.Factory = Factory;
var items = Factory.getData(0);
items.$promise.then(function(itemArr){
var item = itemArr[0];
$scope.data = item;
Factory.setData(item);
});
Если есть лучший способ сделать это, чтобы мне не нужно было устанавливать данные на заводе, это было бы неплохо. Также было бы неплохо не иметь дело с объектом обещания в контроллере, но я не думаю, что было бы возможно получить данные на фабрике.
После настройки данных с использованием вышеуказанной фабрики я получаю к ним доступ в другом контроллере со следующим кодом:
var item = Factory.data();
$scope.selected = [{foo:'bar'},{foo1:'bar1'}];
angular.forEach($scope.selected, function(value, key){
item.requirements.push(value);
})
Factory.setData(item);
В конечном итоге я хочу иметь доступ к одним и тем же изменяющимся данным с обоих контроллеров. Вышеупомянутое работает, но только иногда, и я не уверен, что не устанавливается.
РЕДАКТИРОВАТЬ: я смог заставить его работать все время, используя функциональность $scope.$watch
в контроллере для функции обратного вызова. Данные связаны, но angular должен знать, за чем следить, как это предлагается в ответе ниже.