如何动态设置属性

How to dynamically set properties of this

本文关键字:设置 属性 动态 何动态      更新时间:2023-09-26

我有一个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];
}

相反,我认为问题是当我安慰。登录this,它给我带来了整个浏览器窗口对象),这是失败的引用当前实例。是否有任何我可以实现我正在做的事情,或者这应该是如何工作的,还有另一个问题?

this变量在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
                }
                ...