На самом деле у меня проблемы с получением данных с моего завода.
.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
?
Причина, по которой ваш спулер не может просто использовать свойство.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);
});
};