#angularjs
Не могу понять. Каким образом работает this в сервисах и связь данных с контроллером?
У меня есть сервис запрашивающий данные
app.factory('foldersResource', function($resource){
return {
create: $resource('/create-folder')
};
});
В другом сервисе определяется функция получающая данные и переменная, куда эти данные
сохраняются
app.factory('foldersActionSrv', foldersActionSrv);
foldersActionSrv.$inject = ['openModalSrv', 'foldersResource'];
function foldersActionSrv(openModalSrv, foldersResource) {
return {
folders: [],
getFolders: function () {
this.folders = foldersResource.create.query();
}
}
}
В контроллере я вызываю метод получающий данные. А так же присваиваю в переменную
все полученные до этого данные.
foldersActionSrv.getFolders();
vm.folders = foldersActionSrv.folders;
В таком виде все отлично сохраняется и при изменении данных в folders в сервисе,
также происходят изменения в контроллере и представлении. Все хорошо. Но! Когда я получаю
данные таким способом
function foldersActionSrv(openModalSrv, foldersResource) {
return {
folders: [],
getFolders: function () {
var that = this;
foldersResource.create.query({}, function(result){
that.folders = result;
});
}
}
}
то в folders ничего не сохраняется. В консоль переменная folders выводится, но записать
я в нее ничего не могу. Может есть другой способ решить подобную задачу?
Ответы
Ответ 1
не проверял но думаю заработает :) app.factory('foldersActionSrv', function foldersActionSrv(openModalSrv, foldersResource) { var service = {} service.folders = []; service.getFolders = function(){ foldersResource.create.query({}, function(result){ service.folders = result; }); } return service; }); UPDATE пример сервиса app.factory('CustomersActions', ['Customers', function(Customers){ var service = {} service.customers = []; service.getCustomers = function(){ var query = Customers.query(function(result){ service.customers = result; }); return query; } return service; }]); контроллера var cust = CustomersActions; cust.getCustomers().$promise.then(function(){ $scope.customers = cust.customers; }) получается мы теперь ожидаем когда данные "придут" а потом уже заносим их в скоуп. UPDATE 2 в общем происходит этому потому, что это особенность JS когда грузиться контроллер и вызывается vm.folders = foldersActionSrv.folders; ожидается, что объект передается по ссылке и любые изменения в foldersActionSrv.folders приведут к изменениям в vm.folders так оно и есть, до тех пор пока не будет выполнена getFolders где произойдет that.folders = result; после этого будет ссылаться уже на другой объект(result который), а vm.folders на другой вот самый простой пример test1 = {a:1}; test2 = test1; test3 = {a:2}; test2 = test3; в итоге получиться test1 != test2 test2 === test3 Думаю понятно объяснил))
Комментариев нет:
Отправить комментарий