Настойчивость данных в AngularJS

Я считаю смонтированным app, который расположен в порядке следующего способа:

Menú

 - Sección 1
 - Sección 2
 - Sección 3

Каждая из секций - вид, который загружает данные о API, которая работает, согласившись на каждое из совещаний.

Мое сомнение: Какой-то способ существует с AngularJS поддерживать данные, хотя мы изменим вид? А именно, что, согласившись на секцию 2 с 1, один не потерял данных, вернувшись к ней, и что был должен вновь не консультировать API.

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

Если бы существовал какой-то лучший способ это делать, не сомневайтесь в том, чтобы говорить это мне.

EDIT 1

Прямо сейчас это у меня есть так:

app.controller('IncidenciasCtrl', ['$scope', '$cookies', 'serviceDatosApi', function($scope, $cookies, serviceDatosApi) {
  'use strict';

  serviceDatosApi.devuelveIncidencias("gttp://192.168.1.1/llamadaAPI")
    .then(function(datos){

        $scope.incidencias = datos.data;

    });

}]);


app.service('serviceDatosApi', ['$http', function ($http) {

    this.devuelveIncidencias = function(url) {
      return $http.get(url);
    } 

}]);
2
задан 28.01.2017, 19:50
0 ответов

Новый ответ

promises поддерживают Ваше состояние как только они были выполнены, это значит, что, если ты вновь призываешь then на одной обещание, которое уже было выполнено, эта призовет callback с результатом обещания. А именно, обещание уже хранит результат, полученный тобой!, чего нет, делать значит хранить обещание.

Оставаясь такая услуга:

app.service('svc', ['$http',
  function($http) {
    this.promiseCache = null;
    this.getData = function(url) {
      return this.promiseCache || (this.promiseCache = $http.get(url));
    }
  }
]);

Сейчас проблема с этим состоит в том, что как только решена Promise, ты не сможешь ни получать новости унифицированные указатели ресурса, ни перезагружать добровольно сама унифицированный указатель ресурса. Чтобы преодолевать эту проблему, я оставляю тебе пример: используй договоренность для chache из-за унифицированного указателя ресурса и с выбором recagar любой унифицированный указатель ресурса.

app.service('svc', ['$http',
  function($http) {
    this.promiseCache = [];
    this.getData = function(url, reload) {
      // si se pone reload = true, se borra la cache y vuelve a empezar 
      if (reload) {  delete this.promiseCache[url] }

       // si la promise esta en la chache, retorna la promise o lanza el get
      return this.promiseCache[url] || (this.promiseCache[url] = $http.get(url));
    }
  }
]);

Полный пример: (ты можешь подтверждать из-за консоли, что запрос XHR бросается единственный раз)

var app = angular.module('app', []);

app.service('svc', ['$http',
  function($http) {
    this.promiseCache = null;
    this.getData = function(url) {
      return this.promiseCache || (this.promiseCache = $http.get(url));
    }
  }
]);

app.controller('ctrl', ['$scope', 'svc',
  function($scope, svc) {
    
    $scope.reload = function() {
      svc.getData('http://ipinfo.io/8.8.8.8/json')
        .then(function(datos) {
          $scope.datos = datos.data
        });
    }
    
    // lo invocamos la primera vez. 
    $scope.reload();
  }
]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
  <pre>
{{datos | json}}
<a style="cursor: pointer" ng-click="reload()">Recargar</a>
</pre>
</div>

Первоначальный ответ

какой-то способ существует с AngularJS поддерживать данные, хотя мы изменим вид?

Asumindo, что данные находятся в драйвере (и поэтому они теряются, изменив вид, так как он меняет драйвер), то, что ты можешь делать, состоит в том, чтобы использовать Service.

Один service это singleton, что рождается первый раз, который этому делает инъекцию, и потом, в последующих вставках, всегда будут делать инъекцию той же инстанции услуги во всех последующих (контролирующих) пользователей service в если.

Это это превращает в хороший инструмент, чтобы иметь информацию в течение всего жизненного цикла Веба app и у него есть преимущество, которого несмотря на то, что делает F5, когда Веб перезагружен app, услуга восстанавливается, и теряются данные.

Есть много services built-in как: $interval, $http, $location и другие. И ты можешь делать один собственным.

var app = angular.module('miApp', []);

app.service('datos', ['$http', function ($http) {
    // aqui dentro, this es la instancia del service.
    // por lo que todo lo que almacenes aqui, sera compartido entre todos los 
    // contraladores que injectan el servicio.

    this.unMetodo = function(url) {
       return $http.get(url); // este es un ejemplo de funcion del servicio
    } 
}]);

Потом в драйвере то, что ты должен делать, injectar servico (во всех contoladores)

// fijate que injectamos DATOS
app.controller('controlador1', ['$scope', 'datos', function ($scope, datos) {

   // aqui dentro `datos` es el `this` del servicio datos. 
   // si haces algo como esto se refleja en todos los usuarios del servicio
   datos['algo'] = 'valor';
}]);

В другом драйвере

// fijate que injectamos DATOS
app.controller('controlador2', ['$scope', 'datos', function ($scope, datos) {

   // aqui dentro `datos` tambien es el `this` del servicio datos. 
   // este controlador tiene el valor de datos['algo'] 
   // (siempre y cuando se alla ejecutado primero el codigo del otro controller)
   console.log(  datos['algo']  );
}]);

Используя эту технику очень легко иметь ресурсы / данных между драйверами и из-за существа между совещаниями.

2
ответ дан 03.12.2019, 17:36
  • 1
    explicació n buení пропасть! спасибо. Сомнение, каждый вид загрузил ее призывом к API, я понимаю, что deberí чтобы делать услугу из-за каждого вызова. ¿ Он así? –  20.01.2017, 20:17
  • 2
    @Diego, если делать услугу, чтобы называть api. –  20.01.2017, 20:52
  • 3
    @AlbertArias Спасибо, ¿ как podrí чтобы обнаруживать в controller, что услуга уже está загруженный или нет, чтобы делать вызов или нет?. –  20.01.2017, 20:53
  • 4
    @Diego Ты Включаешь имя услуги драйвера и уже está загруженный услуга и завися, как ты сделал услугу, ты делаешь вызов и из-за твоего вопроса ты используешь localstorage и так остаешься с необходимыми данными, изменив каждый вид. –  20.01.2017, 20:56
  • 5
    @AlbertArias Хороший у меня не остается очень ясной эта часть, но хорошо, я попытаюсь как можно раньше, посмотрим я это получаю. –  20.01.2017, 20:57

существуют большие способы реализовывать то, что ты хочешь, и эти:

  • LocalStorage
  • WebSQL - SQLite
  • IndexDB

Я знаю два сначала, из-за которых я работал с ними, последний, что я поместил в список, никогда я это не работал, но существуй.

Все зависит от, что количество информации оград, которое нужно хранить, но увидев, что уже ты считаешь разработанным приложение, я рекомендую тебе использовать SQLite или WebSQL.

Различие между одним и другой, дело в том, что WebSQL не зависит ни от какого plugin, или дополнение, чтобы использовать уже, было в браузере или уже составленная apk, в то время как, SQLite, оно только функционирует в устройстве посредством дополнения, в твоем случае, что ты работаешь с AngularJS (Угловой 1), не, который такой передовой ты, я рекомендую тебе использовать Ионик Фрамеворк, не, если ты это знаешь, но он помог бы тебе много.

1
ответ дан 03.12.2019, 17:36
  • 1
    Не, если я понял тебя хорошо, но ты комментируешь мне сохранения informació n, я не нуждаюсь в том, чтобы сохранять ее в базе данных, если не, что сохранил вид, когда он изменится другой, чтобы не делать названные в API' s весь промежуток времени и следовательно имея огромные времена груза. –  20.01.2017, 20:21
  • 2
    Конечно, после которого уже ты сохранял ее, ты можешь заставлять избегать того, чтобы ты сделал просьбы без необходимости. Уже, если ты хочешь применить XMPP или какую-то форму, которой тот же сервер ты envié обновления, без необходимости насыщать сервер. –  20.01.2017, 21:37
  • 3
    Вот то, что я ищу, но спасибо за помощь. –  21.01.2017, 13:31
  • 4
    @Diego так как, если он не что я не понимаю поиски, сначала позволь мне знать, знаешь ли ты о том, что я рекомендую тебе в ответе, ответь мне, чтобы знать. –  22.01.2017, 01:33