2016-11-15 3 views
0

У меня есть служба, которую я использую в нескольких контроллерах в своем приложении.

Служба содержит вызов $ http скрипту php, который возвращает некоторые важные данные.

Что я хочу сделать, это получить эти данные из localstorage пользователя, если запрос не удался, а затем вызвать все функции, связанные с успехом $ http во всех контроллерах.

Это то, что часть моей службы выглядит следующим образом:

app.service('initialJSON', ['$http', function ($http) { 
    var vm = this; 
    vm.json = $http.get(url); 
    vm.json.success(function (data) { 
    if (typeof Storage !== "undefined") { 
     localStorage.initialJSON = data; 
    } 
    }) 
    vm.json.error(function (data, status) { 
    if (typeof Storage !== "undefined" && "initialJSON" in localStorage) { 
     // call all success functions in all controllers with the locally saved data 
    } 
    }); 
}]); 

В качестве примера функции в этом контроллере следует назвать:

app.controller('someCtrl', ['initialJSON', function(initialJSON) { 
    var vm = this; 

    initialJSON.json.success(function (data) { 
    // This function should be called and do some things with the data 
    }); 

}]); 

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

+0

какая версия углового вы используете? – alphapilgrim

+0

Я использую 1.5.0 – tjespe

ответ

2

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

app.service('initialJSON', ['$http', '$q', function ($http, $q) { 
    var vm = this; 
    var deferred = $q.defer(); 
    vm.json = deferred.promise; 

    var request = $http.get(url); 
    request.then(function (response) { 
    if (typeof Storage !== "undefined") { 
     localStorage.initialJSON = response.data; 
     deferred.resolve(response.data); 
    } 
    }) 
    request.catch(function() { 
    if (typeof Storage !== "undefined" && "initialJSON" in localStorage) { 
     deferred.resolve(localStorage.initialJSON); 
    } 
    }); 
}]); 

Если ваши контроллеры заботятся только об успешном завершении, это должно работать. Если вам нужно, чтобы они могли обрабатывать ошибки, вам нужно каким-то образом расширить его, чтобы вызвать deferred.reject(), выполнив обе попытки получить данные.

+0

И как мне привязать функции к успеху в моих контроллерах? – tjespe

+0

Я понял. '. then' используется вместо' .success' и '.catch' используется вместо' .error' – tjespe

+1

@tjespe вы должны использовать '.then' и' .catch' с '$ http' также. '.success' и' .error' устарели. – kicken

-1

Вы можете пойти только с локальным хранением и печенье: https://github.com/grevory/angular-local-storage

Или, если вы ищете что-то немного больше: архитектуру https://github.com/angular-pouchdb/angular-pouchdb

Когда вы говорите «называют все функции успеха» вы должны действительно оберните эти звонки в обещание. Таким образом, услуга может выглядеть следующим образом:

service('myService', ['$q',function($q){ 
    var _privateServiceCall = function(){ 
     return myPromiseBasedCall().then(
      function(response){return response;} 
     ).catch(function(err){ 
      throw(err); 
     }); 
    }; 
    return { 
     publicServiceCall = function(){ 
      var defer = $q.defer(); 
      _privateServiceCall().then(function(response){ 
       defer.resolve(response); 
      }).catch(function(err){ 
       throw err; 
      }) 
      return defer.promise; 
     } 
    } 
}]); 

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

.controller('myController', ['$scope', 'myService', function($scope, myService){ 
    myService.publicServiceCall().then(function(response){ 
     console.log(response); 
    }); 
} 
}]); 

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