Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Не изменяются данные в сервисе

#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 Думаю понятно объяснил))

Комментариев нет:

Отправить комментарий