如何动态设置此属性

时间:2015-10-25 17:21:55

标签: javascript angularjs

我有一个AngularJS工厂方法,它设置这样的属性(特别是在getPageInformation方法中):

function factoryMethod($http, $q) {
    return function(id) {
        return {
            id: id,

            getPageInformation: function() {
                var deferred = $q.defer();

                $http({
                    method: "post",
                    url: 'getInfo.php',
                    data: {
                        id: this.id
                    },
                    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
                }).then(function(successResponse) {
                    console.log(successResponse);
                    deferred.resolve('Fetched');

                    for (var attr in successResponse.data) {
                        this[attr] = successResponse.data[attr];
                    }

                }, function(errorResponse) {
                    console.log(errorResponse);
                    deferred.reject('Unable to fetch');
                });

                return deferred.promise;

            }
        }
    }
}

问题不在于AngularJS,因为你可以看到我正在返回并反对(来自花括号语法),但我需要能够动态设置对象属性。我通过响应得到的相应信息循环,但它没有设置它:

for (var attr in successResponse.data) {
    this[attr] = successResponse.data[attr];
}

相反,我认为问题是(当我将console.loged this带给我整个浏览器窗口对象时),这无法引用当前实例。有没有我可以实现我正在做的事情,或者它应该如何运作,还有另一个问题?

1 个答案:

答案 0 :(得分:1)

Javascript中this变量的含义很痛苦。您可以尝试在线搜索血腥细节。对于这个问题,我认为足以说回调中的this很可能您的直觉期望。你需要创建一个真实的闭包,通常用:

return {
    ...
    getPageInformation: function() {
        var self = this; // The closed variable here
        ...
        $http({...})
            .then(function(successResponse) {
                ...
                for (var attr in successResponse.data) {
                    self[attr] = successResponse.data[attr]; // Use like this
                }
                ...