Я вызываю некоторые API-интерфейсы для отдыха в моем приложении "Угловое", чтобы получать данные с сервера и отображать их на странице (например: домашняя страница). Но каждый раз, когда я посещаю страницу, API попадает, и данные извлекаются и отображаются, потому что в моем контроллере я вызываю службу останова. Есть ли какой-либо "лучший" способ "сохранить" данные при первом вызове, а затем, когда пользователь посещает одну и ту же страницу, отображает "сохраненные" данные вместо того, чтобы снова и снова использовать службы отдыха?
Кроме того, будут случаи, когда я хочу использовать API вместо отображения сохраненных данных (например: когда пользователь выходит из системы и снова регистрируется, или когда данные обновляются на сервере). Какой лучший способ с помощью Angular реализовать такую функциональность?
Вот рабочий Plunker для демонстрации моего текущего приложения. (Пожалуйста, см. Пример home.js для вызова службы).
angular.module('home').controller('HomeCtrl', function($scope, DrinkService) {
var vm = this;
vm.loading = true;
vm.greeting = "Drink World!";
DrinkService.getDrinks().then(function(response) {
vm.drinks = response.data.results;
console.log(vm.drinks);
vm.loading = false;
});
}).factory('DrinkService', ['$http',
function($http) {
var url = 'https://raw.githubusercontent.com/Randmness/DeathByCaffeine-Enyo/master/data/canonDbList_dbService.json';
var drinkService = {};
drinkService.getDrinks = function() {
return $http.get(url).then(function(response) {
return response;
});
};
return drinkService;
}
]);
Вы можете использовать услугу с помощью $q
. Пример службы будет
service('myService', function($q, $http) {
this.data;
var self = this;
this.getMyData = function() {
if (angular.isDefined(self.data)) {
// use $q to return a promise
return $q.when(self.data)
}
return $http.get('myurl').then(function(resp) {
self.data = resp;
})
}
}
Служба установит значение из API при первом вызове и установит значение в службе, чтобы последующие вызовы использовали сохраненные данные.
В контроллере вы можете вызвать myService.getMyData()
вы можете увидеть аналогичный вопрос здесь
@user2954587 ответ вам поможет. Я также хотел бы добавить, что сервисы одноточечные, т.е. Они созданы один раз и, следовательно, идеально подходят для хранения данных, обмена данными между другими контроллерами и т.д. Контроллеры с другой стороны связаны с представлением. При каждом загрузке представления загружается также связанный с ним контроллер. Вам также необходимо удалить данные из службы несколько раз (в вашем случае, когда вы myService
из системы), просто установите приложение myService
на контроллер, где вы выполняете операцию выхода, и установите data
в undefined
.