在Angular中从工厂调用属性

时间:2015-07-21 13:17:11

标签: javascript angularjs

我实际上遇到了从工厂检索数据的问题。

.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 个答案:

答案 0 :(得分: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);
    });
};