2015-06-18 3 views
0

я следующая проблема:хранить данные в контроллере во время маршрутизации в угловом

В AngularJS приложения я использую $routeProvider для загрузки различных частей в применение

config(['$routeProvider', function($routeProvider) { 
    $routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'MyCtrl1'}); 
    $routeProvider.when('/view2', {templateUrl: 'partials/partial2.html', controller: 'MyCtrl2'}); 
    $routeProvider.when('/users', {templateUrl: 'partials/users.html', controller: 'UserCtrl'}); 
    $routeProvider.otherwise({redirectTo: '/view1'}); 
}]); 

В моем UserCtrl отобразить список пользователей, которые я может манипулировать. Я прочитал список пользователей из JSON, который выглядит следующим образом:

{"users":[{"id":1,"name":"test user 2","mail":"[email protected]","ringer":true,"active":true},{"id":2,"name":"test user 1","mail":"[email protected]","ringer":false,"active":true},{"id":3,"name":"admin","mail":"[email protected]","ringer":false,"active":true}]} 

В users.html У меня есть контроллер, который вызывает службу загрузки данных

'use strict'; 

/* Controllers */ 

angular.module('myApp.controllers', []). 
    controller('MyCtrl1', [function() { 

    }]) 
    .controller('MyCtrl2', [function() { 

    }]) 
    .controller('UserCtrl', ['$scope', 'UsersService', function($scope, UsersService) { 
    //alert(UsersService.fetchData().length); 
    UsersService.fetchData().then(function(data){ 
     // Do whatever you want with data, like: 
     $scope.users = data.users; 
    }); 

    this.users = $scope.users; 
    this.selected = []; 
    this.searchTerm = ''; 

    $scope.selected = this.selected;  
    }]) 
; 

и, наконец, обслуживание:

'use strict'; 

/* Services */ 


// Demonstrate how to register services 
// In this case it is a simple value service. 
angular.module('myApp.services', []). 
    value('version', '0.1') 
    .factory('UsersService', function($http, $q) { 

    var data = []; 

    function fetchData() { 
    var deffered = $q.defer(); 
    if (_isDataPresent()) { 
     deffered.resolve(_returnData()); 
    } else { 
     //var deffered = $q.defer(); 
     $http.get('php/users.php') 
     .success(function (d) { 
     deffered.resolve(d); 
     data = d.users; 
     }); 
     return deffered.promise; 
    } 
    } 

    function _isDataPresent() { 
    return data.length; 
    } 

    function _returnData() { 
    return data; 
    } 

    return { fetchData : fetchData }; 

}); 

Проблема, которая у меня есть, заключается в следующем: каждый раз, когда я загружаю users.html, данные перезагружаются из json-файла. Я хочу загрузить данные только один раз и сохранить их в своем контроллере. Теперь, когда я делаю некоторые изменения в данных, переключитесь на другое представление и вернусь, все изменения будут потеряны.

Любая помощь будет оценена по достоинству.

Спасибо, Zbynek

+0

Создайте сервис, который хранит ваши данные при первом запросе, сохраняет значение. Затем, для следующего запроса, вы можете вернуть его «кэшированное» значение. Поскольку контроллеры постоянно меняются, вы не можете «хранить» данные там. – avcajaraville

+0

Спасибо, у вас есть пример? – Zbynek

+1

Я думаю, вам нужно хранить данные JSON в localstorage/cookie и т. Д. – Joy

ответ

2

Это простой пример того, что я имел в виду:

.factory('UsersService', function($http, $q) { 

    var users = []; 

    function fetchUsers() { 
    var deffered = $q.defer(); 
    if (_areUsersPresent()) { 
     deffered.resolve(_getUsers()); 
    } else { 
     $http.get('php/users.php') 
     .success(function (response) { 
     deffered.resolve(response.users); 
     data = d.users; 
     }); 
     return deffered.promise; 
    } 
    } 

    function _areUsersPresent() { 
    return (users.length()) ? true : false; 
    } 

    function _getUsers() { 
    return users; 
    } 

    function setUsers(newUsers) { 
    users = newUsers; 
    } 

    return { fetchUsers : fetchUsers, setUsers : setUsers }; 

}); 

Вы можете использовать это на контроллерах, как

UsersService.fetchUsers().then(function(users){ 
    // Do whatever you want with data, like: 
    $scope.users = users; 
}); 

И всякий раз, когда вы обновите пользователей на ваших контроллерах, вы должны обновить информацию об услуге:

// Doing operations with $scope.service, when finish with them: 
UsersService.setUsers($scope.users); 
+0

Это возвращает объект с функцией then, catch и finally и объекты $$ scope и __proto__. Как получить данные с этого объекта? – Zbynek

+0

Я отредактировал свой ответ – avcajaraville

+0

Спасибо - только один комментарий - мне кажется, что FetchData возвращает обещание в случае, когда данные загружаются из json и data (array), если _returnData() называется – Zbynek