【问题标题】:accessing object properties with object method使用对象方法访问对象属性
【发布时间】:2013-10-04 09:08:19
【问题描述】:

我正在尝试构建一个名为 myApp 的应用程序,该应用程序具有属性 regularNameErrors 和方法 populateJSON,该方法使用 AJAX 调用来获取 JSON 对象,然后将其添加到声明为该方法的参数之一的属性中。

获取数据的功能确实有效,因为位置 3 的警报提供了正确的键列表。但是 1 处的警报返回 undefined 并且 2 处的警报为空白。

当我再次用myApp.regularNameErrors = data 替换行destination = data 时,它可以工作,所以我认为我误解了如何将对象属性传递给对象方法。但是我想多次使用方法 populateJSON 并且需要知道传递属性的正确方法。

var myApp = {
init: function () {
    myApp.populateJSON(myApp.regularNameErrors, 'data/spelling.json').done(function () {
        alert(myApp.regularNameErrors['kingscross']); //1
    });
},
regularNameErrors: {}, //Object of spelling mistake:proper key:value pairs
populateJSON: function (destination, source) {
    var def = $.Deferred();
    $.getJSON(source, function (data) {
        destination = data;
        alert(Object.keys(myApp.regularNameErrors)); //2
        alert(Object.keys(data)); //3
        def.resolve();
    });
    return def.promise();
},
};

【问题讨论】:

  • 您将regularNameErrors 分配为一个空对象,然后从不添加任何属性,这就是为什么显示的代码为myApp.regularNameErrors['kingscross'] 提供undefined 并在您列出警报中的键时为空白。当您说要多次调用populateJSON() 时,您的意思是希望每次调用都向regularNameErrors 添加额外的数据,还是希望每次调用都替换之前的值?
  • 另外,你不需要人为的延迟对象; jQuery 中的所有 AJAX/JSON-P 请求都是延迟的示例,所以你可以这样做 return $.getJSON(...
  • 我想使用 'populateJSON' 来填充此处未显示的几个不同属性。我将“regularNameErrors”声明为空,然后将其用作“populateJSON”的目标输入,以便 getJSON 调用的结果是“regularNameErrors”的新值
  • @utkanos 只是为了确认 AJAX 请求的延迟部分只会在 ajax 调用和 ajax 调用后运行的函数完成时才响应 done

标签: javascript jquery ajax object


【解决方案1】:

由于能够使用返回的 getJSON 对象的延迟属性,函数可以减少到几行,因此无需创建名为 populateJSON 的新函数

var myApp = {
init: function () {
    $.getJSON('data/spelling.json').done(function(data) {
        myApp.regularNameErrors = data;
    });
},
regularNameErrors: {},
};

【讨论】:

    【解决方案2】:

    destination 不是指向您传递给函数的属性的“指针”,而是一个保存属性评估值的变量。当您分配给destination 时,您只需写入您的populateJSON 函数的局部变量。

    如果您希望能够声明目的地,则需要传递一个基础对象(或始终使用myApp)和一个属性名称:

    var myApp = {
        init: function () {
            myApp.populateJSON('regularNameErrors', 'data/spelling.json', function() {
                alert(Object.keys(myApp.regularNameErrors)); //2
                alert(myApp.regularNameErrors['kingscross']); //1
            });
        },
        regularNameErrors: {}, //Object of spelling mistake:proper key:value pairs
        populateJSON: function (destinationName, source, callback) {
            $.getJSON(source, function (data) {
                myApp[destinationName] = data;
                alert(Object.keys(data)); //3
                callback();
            });
        }
    };
    

    但是,我看到您正在使用承诺模式。 Promise 不应该用作简单的通知器(“现在数据已经到达某处”),但它应该代表数据本身(“现在,这里是数据” ) - 用数据解决它,而不是将数据存储在全局变量/属性中并且什么都不解决。实际上,$.ajax does already return such a promise 所以你不必为此做太多事情:

    var myApp = {
        init: function () {
            myApp.regularNameErrors = $.getJSON('data/spelling.json');
            myApp.regularNameErrors.done(function(data) {
                alert(Object.keys(data)); //3
                alert(data['kingscross']); //1
            });
        }
    };
    

    【讨论】:

    • 所以警报在哪里检查它是否正常工作并找到错误的来源。是否可以使用行'myApp.regularNameErrors = $.getJSON('data/spelling.json').done();'
    • 是的,这是一个可能的捷径 - .done 返回它被调用的承诺。
    • 如何仅将数据返回到属性?抱歉,如果这些问题变得愚蠢,我会坐下来更仔细地阅读诺言
    • 你可以在your answer 中做类似的事情,但我建议在属性中缓存承诺本身并在访问它时始终使用.then/.done。当然,这会使你所有的代码异步,但是你可以在init()之后调用使用promise的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2021-03-05
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多