#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 Думаю понятно объяснил))
Комментариев нет:
Отправить комментарий