2014-09-26 6 views
0

Итак, вот моя общая проблема: у меня есть фабрика, которая должна сделать вызов ajax, чтобы получить ее значение. Я хочу ввести эту фабрику, но только после того, как вызов ajax был разрешен, то есть когда он был введен, я хочу, чтобы значение уже было там. Это возможно? Позвольте мне дать вам какой-то контекст, чтобы вы могли дать мне лучший вариант.Зависимость углового разрешения от обещания

У меня есть UserFactory.

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

    function(){ 
     //ajax call to get the user object 
     //dont allow injection until user has arrived 
    } 
]); 


var home = angular.module('home',[]); 
home.controller('UserInfoController',[ 
    'UserFactory',//I don't want this resolved until the ajax call has completed 
    function(User){ 
     //bind user data to the view 
    } 
]); 

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

+0

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

ответ

0

Что вы можете сделать, это настроить завод, чтобы он запоминал пользовательские данные.

Что-то вроде этого

app.factory('userFactory', function ($http){ 
    return { 
     getUser: function(){ 
      return $http({ 
       method: 'GET', 
       url: '' 
      }); 
     }, 
     currentUser: {} 
    }; 
}); 

Итак, в контроллере, проверьте, есть ли что-нибудь в CurrentUser. Если не сделать вызов getUser и сохранить его в currentUser. Поскольку фабрика является одноэлементной, пользовательские данные всегда будут существовать на этой фабрике, и вы можете вводить ее в любом месте, где она вам нужна.

Вот пример: http://jsfiddle.net/4m6gmsw2/

Если вам еще нужны данные пользователя, чтобы быть там перед впрыскиванием вы посмотрите на использование решительности можете: https://thinkster.io/egghead/resolve/

0

В состоянии маршрутизатора есть решить свойство для каждое государство.

.state({ 
    name: 'myState', 
    resolve: { 
    user: function(myService) { 
     return myService.asyncGet(); 
    } 
    } 

Тогда в контроллере:

.controller('myController', function(user) { 
    $scope.myData = user.data; //no messy promises 
}); 
Смежные вопросы