2013-07-03 5 views
3

На основе this thread я реализовал следующие (с использованием Restangular):Совместное использование restangular ресурсов между контроллерами

app.factory('Account', function(Restangular) { 
     var _account; 

     return { 
     get: function(id, success, failure) { 
      // If we've already retrieved an account, return that 
      if (angular.isDefined(_account)) { 
      console.log('local'); 
      success(_account); 

      // Otherwise request the resource and store it for subsequent requests 
      } else { 
      console.log('server'); 
      Restangular.one('accounts', id).get().then(
       // Success 
       function(account) { 
       _account = account; 
       success(_account); 
       }, 
       // Failure 
       function(response) { 
       if (angular.isDefined(failure)) { 
        failure(response); 
       } 
       } 
      ); 
      } 
     } 
     } 
    }); 

Я использую его, как это из моих контроллеров:

Account.get(1, function(account) { 
    $scope.account = account; 
}); 

Проблема заключается в том, что, поскольку вызовы являются asyc, все вызовы проверяют _account и обнаруживают, что он является нулевым, и поэтому делают вызов сервера, тогда я получаю a) несколько вызовов сервера для одной и той же вещи и b) несвязанные модели.

Если я изменить код, чтобы вернуть «обещание» немедленно, я нахожу, что я не могу редактировать любые текстовые поля, которые я связываясь с нг-модель ..

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

+0

Если я верну обещание? немедленно: _account = Restangular.one ('accounts', id) .get(); успех (_account); Пользовательский интерфейс отображает правильные данные из ресурса, а любые запросы после первого используют локальный объект, но если у меня есть это под двумя контроллерами: Если я попытаюсь отредактировать любой из них, ни одно из моих нажатий клавиш не появится? – matthewrk

+0

Я думаю, что это проблема: https://github.com/angular/angular.js/issues/1827 – matthewrk

ответ

2

Вот мое (шероховатое) решение:

Там, кажется, ошибка с Угловыми и обещаниями, подробно здесь: https://github.com/angular/angular.js/issues/1827

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

app.factory('Account', function(Restangular) { 
     var _account; 
     var _promise; 
     var _callbacks = new Array(); 

     return { 
     get: function(id, success, failure) { 
      // If we have a local account, immediately call success 
      if (angular.isDefined(_account)) { 
      success(_account); 
      } 

      // If we've already obtained a promise, add to callbacks to be notified 
      // when the promise resolves 
      else if (angular.isDefined(_promise)) { 
      _callbacks.push(success); 
      } 

      // Make a server request 
      else { 
      console.log('request from server'); 
      _callbacks.push(success); 
      _promise = Restangular.one('accounts', id).get().then(
       function(account) { 
       _account = account; 
       // Fulfill promises 
       angular.forEach(_callbacks, function(callback) { 
        callback(_account); 
       }); 
       _promise = null; 
       } 
      ); 
      } 
     } 
     } 
    }); 
+0

Спасибо за обмен. Не могли бы вы также привести пример использования в контроллере? благодаря – Iladarsda

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