2014-07-16 6 views
1

В настоящее время я использую службу $ http из angularjs для извлечения данных из локально размещенного json-файла. Затем данные из этого файла отправляются контроллеру и отображаются как состояние в представлении через ui.router, в котором данные могут быть изменены. Измененные данные из этого состояния затем отображаются в другом состоянии, которое показывает эти данные в формате json, чтобы затем копироваться и вставляться в документ пользователем. Тем не менее, каждый раз, когда я меняю состояния, измененные данные возвращаются к исходным данным, поскольку контроллер должен перезагружать исходные данные каждый раз при изменении состояния. Есть ли способ сделать загрузку данных только один раз?

services.js

angular.module('angNewsApp') 
.service('CustomerService', ['$http', function($http) { 

    var customers; 


    function init() { 
     return $http.get('customers/customers.json') 
     .then(function(data) { 
      customers = data.data; 
     }); 
    } 

    function getCustomers() { 
     return customers 

    } 

    return { 
     init: init, 
     getCustomers: getCustomers 
    }; 

}]) 

customerController.js

angular.module('angNewsApp') 

.controller('CustomerCtrl', function($scope, CustomerService) { 

CustomerService.init().then(function() { 
    $scope.customers = CustomerService.getCustomers(); 
    angular.forEach($scope.customers, function(customer) { 
    angular.forEach(customer.external_photos, function(photo) { 
     // Possibly fix broken URLs here. 
     // photo.external_url 
    }); 
    }); 
}); 
//if you console.log($scope.customers) out here it returns as undefined 

ответ

0

Как правило, в этой ситуации я сделать запрос на HTTP в первый раз метод обслуживания называется затем просто использовать кэшированное значение при последующих вызовах ,

angular.module ('angNewsApp') .Service ('CustomerService', [ '$ HTTP', '$ д', функция ($ HTTP, $ Q) {

function getCustomers() { 
    var deferred = $q.defer(); 
    if (!this.customers) { 
     $http.get('customers/customers.json') 
    .then(function(data) { 
     this.customers = data.data; 
     deferred.resolve(this.customers); 
    }); 
    } else { 
     deferred.resolve(this.customers); 
    } 

    return deferred.promise; 

} 

return { 
    customers: undefined, 
    getCustomers: getCustomers 
}; 

}])

Затем в контроллер CustomerService.getCustomers(). затем (функция (клиенты) {

$scope.customers = customers; 
... 

Имейте в виду, если хотите изменения для клиентов возражают упорствует через стат вам необходимо обновить объект CustomerService.customers.

Смежные вопросы