как предотвратить вызов API остальных в контроллере при каждом посещении маршрута / страницы

0

Я вызываю некоторые 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;
  }
]);
  • 0
    Был ли ответ полезным?
  • 0
    Привет! Очень жаль за поздний ответ (застрял в какой-то другой задаче). Хотя я еще не пробовал решение, но оно определенно очень полезно! Помечу зеленым, как только я попробую. Ваша помощь очень ценится. :)
Показать ещё 1 комментарий
Теги:

2 ответа

2
Лучший ответ

Вы можете использовать услугу с помощью $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()

вы можете увидеть аналогичный вопрос здесь

  • 0
    Я пытаюсь вызвать сервисный метод 'getMyData' в контроллере. Когда я пытаюсь зарегистрировать значение сервиса, он возвращает объект. Но когда я пытаюсь зарегистрировать service.data, он дает «неопределенный». Можете ли вы помочь немного. Пожалуйста, посмотрите этот plunkr (home.js): plnkr.co/edit/lk3e383ExRVuDykicMKs?p=preview
  • 1
    Спасибо! Решил проблему, добавив «then» после myService.getMyData: DrinkService.getMyData (). Then (function () {vm.drinks = DrinkService.data; vm.loading = false;}); Но, пожалуйста, дайте мне знать, если я использовал правильный подход! :)
2

@user2954587 ответ вам поможет. Я также хотел бы добавить, что сервисы одноточечные, т.е. Они созданы один раз и, следовательно, идеально подходят для хранения данных, обмена данными между другими контроллерами и т.д. Контроллеры с другой стороны связаны с представлением. При каждом загрузке представления загружается также связанный с ним контроллер. Вам также необходимо удалить данные из службы несколько раз (в вашем случае, когда вы myService из системы), просто установите приложение myService на контроллер, где вы выполняете операцию выхода, и установите data в undefined.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню