Мне нужно немного помочь структурировать мое угловое приложение.угловой вид не обновляется с общего сервиса
У меня есть два контроллера, «OfferListCntrl» (отображает список предложений) и «OfferDetailsCntrl» (отображает одно предложение через id), а также сервис/модель под названием «Предложения». Они подключаются к двум веб-сервисам, соответственно через службу предложений, GetOffers (возвращает массив предложений) и GetOffer (возвращает одно предложение), и я пытаюсь избежать вызова GetOffer (id), если GetOffers уже вызван (сохраняет вызов службы)
MyApp.factory('Offers', function($http,Config) {
var data=[];
var Offers = {
get: function() {
var promise = $http.get(Config.API_END_POINT + "GetOffers?appID=12",{cache:"true"})
.then(function (response){
data = response.data;
return response.data;
});
return promise;
},
getOffer: function(id) {
var local = _.find(data.Offers, function(offer) { return offer.OfferID == id });
if(local){
console.log("local copy found:" + local.OfferID);
console.log(local.Description);
console.log(local);
return local;
}
else {
var promise = $http.get(Config.API_END_POINT + "GetOffer?appID=12&OfferID=" + id,{cache:"true"})
.then(function (response){
console.log("no local, calling ws");
return response.data;
});
return promise;
}
}
};
return Offers;
});
function OfferDetailCtrl($scope,$http,Offers) {
Offers.get().then(function (asyncData){
$scope.offers = asyncData.Offers;
});
}]);
function OfferDetailCtrl($scope,$routeParams,$http,$location,Offers) {
$scope.offerId = $routeParams.offerId;
Offers.getOffer($scope.offerId).then(function (asyncData){
$scope.offer = asyncData;
});
}
1 вопрос.
- Беда в том, когда Offers.getOffer (ID) называется: он, кажется, обнаружить погоду она имеет локальные данные или нет, как и следовало ожидать, если нет локальных данных он вызывает WebService, и все это хорошо, но если есть существующие данные, он пытается вернуть его в OfferDetailCtrl, а затем ошибки. Я могу console.log его содержимое перед возвратом, и все это кажется неповрежденным, поэтому я запутался, почему контроллер примет обещание, но не фактический объект.
Error: 'undefined' is not a function (evaluating 'Offers.getOffer($scope.offerId).then(function (asyncData){ $scope.offer = asyncData; console.log($scope.offer); })') [email protected]http://staging.scanzap.com.au/assets/js/offers/OfferDetailController.js:17
, если есть лучший способ, которым я мог бы делать это ID любовь слышать :) спасибо за вашу помощь
Ответ - услуга ... Я должен купить домен theanswerisaservice.com, поэтому он часто отвечает на вопросы SO для AngularJS. Если вам необходимо поддерживать постоянное состояние некоторых объектов на протяжении всего срока службы приложения (ради совместного использования данных и не создания дополнительных запросов), это решение является решением. http://www.youtube.com/watch?v=ZhfUv0spHCY&t=26m40s <Я предлагаю смотреть весь разговор много раз, когда у вас есть время. – shaunhusain
Другой вариант, если услуга не имеет смысла для связи между вашими контроллерами, заключается в использовании событий ($ on, $ broadcast, $ emit) для обмена данными между контроллерами дочерних/родительских контроллеров. – shaunhusain
спасибо за ответ, и плохо проверьте ссылку. Однако я подумал, что то, что я уже делал с «Предложениями», и вставляю его в оба контроллера, как вы можете видеть в приведенном выше коде. Есть предложения, как я определил его выше (используя заводской метод), а не услугу? – owlyfool