2013-07-21 4 views
0

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

У меня есть два контроллера, «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 вопрос.

  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 любовь слышать :) спасибо за вашу помощь

+0

Ответ - услуга ... Я должен купить домен theanswerisaservice.com, поэтому он часто отвечает на вопросы SO для AngularJS. Если вам необходимо поддерживать постоянное состояние некоторых объектов на протяжении всего срока службы приложения (ради совместного использования данных и не создания дополнительных запросов), это решение является решением. http://www.youtube.com/watch?v=ZhfUv0spHCY&t=26m40s <Я предлагаю смотреть весь разговор много раз, когда у вас есть время. – shaunhusain

+0

Другой вариант, если услуга не имеет смысла для связи между вашими контроллерами, заключается в использовании событий ($ on, $ broadcast, $ emit) для обмена данными между контроллерами дочерних/родительских контроллеров. – shaunhusain

+0

спасибо за ответ, и плохо проверьте ссылку. Однако я подумал, что то, что я уже делал с «Предложениями», и вставляю его в оба контроллера, как вы можете видеть в приведенном выше коде. Есть предложения, как я определил его выше (используя заводской метод), а не услугу? – owlyfool

ответ

0

Попробуйте сделать что-то вроде этого вместо того, чтобы быть уверенным, чтобы ввести $ Q, а также ,

getOffer: function(id) { 
     var deferred = $q.defer(); 
     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); 
      deferred.resolve(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"); 
       deferred.resolve(response.data); 
      }); 
     } 

     return deferred.promise; 

    } 
+0

спасибо за это, я думал, что это что-то в этом роде. К сожалению, я все еще получаю ошибку (хром :) TypeError: Объект # не метод «затем» в новом OfferDetailCtrl (сафари :) Ошибка: «не определено» не является функцией (оценка «предложения .getOffer ($ scope.offerId) .then (функция (asyncData) { \t //console.log("async данные», asyncData); \t $ scope.offer = asyncData; }) ') – owlyfool

+0

это, как его называют ... wether я реализую ваше решение выше или оставляю его как есть, я получаю ту же ошибку 'code' Предложения .getOffer ($ scope.offerId). then (function (asyncData) { \t $ scope.offer = asyncData; }); 'code' – owlyfool

+0

ah, должен был вернуть myPromise.promise, чтобы заставить его работать, отредактированный, чтобы отразить изменения, большое спасибо за вашу помощь. – owlyfool

Смежные вопросы