Вызов атрибута с завода в Angular

0

На самом деле у меня проблемы с получением данных с моего завода.

.factory('Spooler', ['$http', '$q', '$log', 'Domains', function ($http, $q, $log, Domains) {

var Spooler = function (id) {
    this.id = id;
    this.name = null;
};

Spooler.prototype.load = function () {
    var self = this;
    var deferred = $q.defer();
    $http.post('/spooler/' + this.id + '/load')
        .success(function(data) {
            self.name = data.name;
            deferred.resolve(self);
        })
        .error(function(err, code) {
            deferred.reject(err);
        $log.error(err, code);
    });
    return deferred.promise;
};

Это устанавливает фабрику, поэтому я могу вызвать: var spooler = new Spooler(1), который возвращает спулер (я могу прочитать хорошее имя в журналах контроллера). Мой вопрос: как я могу получить доступ к атрибуту name? Я сделал еще один метод на заводе:

Spooler.prototype.getName =  function() {
    return this.name;
}

Почему я не могу просто вызвать spooler.name? поскольку спулер возвращает имя в controller?

  • 1
    Ваша фабрика больше похожа на сервис.
Теги:

1 ответ

0

Причина, по которой ваш спулер не может просто использовать свойство.name, заключается в том, что ваше свойство фактически равно null пока ваше обещание не будет разрешено. Если вам нужно надежно получить доступ к имени и другим свойствам, либо используйте функцию.then на своей загрузке, либо выполните обратный вызов.

var myspooler = Spooler(1);

myspooler.load().then(function(data){
   ... do something with your data ...
});

или

myspooler.load(function(data){
  ... do something with your data ...
})

и ваша услуга становится

Spooler.prototype.load = function (callback) {
    var self = this;
    var post = $http.post('/spooler/' + this.id + '/load')
        .success(function(data) {
            self.name = data.name;
            callback(data);
        })
        .error(function(err, code) {
           callback(err);
        $log.error(err, code);
    });
};
  • 0
    Большое спасибо за ваш ответ. Означает ли это, что я должен использовать then () после вызова spooler.load ()?
  • 0
    добавил, как реализовать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню