Я пытаюсь «контролировать» данные на заводе от двух отдельных контроллеров, и хотя приведенный ниже код работает нормально, он не всегда работает. По какой-либо причине он связывает данные только в 50% случаев. Есть ли способ убедиться, что данные привязываются все время, и если либо контроллеры вносят изменения в данные, что изменения будут отражаться на обоих концах.AngularJS: данные об услугах управления с фабрикой
Услуги:
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);
В конце концов, я хочу, чтобы иметь возможность получить доступ к тем же изменяющуюся данные из обоих контроллеров. Вышеупомянутые работы, но только в некоторые моменты времени, и я не уверен, что не получается.
EDIT: Я смог заставить его работать все время, используя функциональность в контроллере по функции обратного вызова. Данные привязаны, но угловатые должны знать, что смотреть, как это предлагается в ответе ниже.
Я переключил контроллер, чтобы использовать обратный звонок, чтобы избежать использования объекта обещания, который действительно хорош. Однако я не могу установить this.mydata в обратном вызове функции getData. Ошибка проста, что она не определена, потому что я предполагаю, что она не в сфере видимости. Есть ли у вас какие-либо идеи о том, как это установить? Я предполагаю, что это корень, почему он работает только некоторое время. –
Попробуйте потерять «это» и просто ссылайтесь на myData. Объявите 'var myData = ""' в сервисе Factory. – BoxerBucks
У меня такая же проблема, что она не определена. Я не уверен, почему эта переменная была бы недоступна из обратного вызова успеха, но это не так. –