0

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

获取数据的功能肯定有效,因为位置 3 的警报给出了正确的键列表。但是,1 处的警报返回未定义,2 处的警报为空白。

当我再次destination = data用它替换该行时,myApp.regularNameErrors = 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();
},
};
4

2 回答 2

0

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确实已经返回了这样的承诺,因此您不必为此做太多事情:

var myApp = {
    init: function () {
        myApp.regularNameErrors = $.getJSON('data/spelling.json');
        myApp.regularNameErrors.done(function(data) {
            alert(Object.keys(data)); //3
            alert(data['kingscross']); //1
        });
    }
};
于 2013-10-04T10:16:35.957 回答
0

通过使用返回的 getJSON 对象的延迟属性的能力,函数可以减少到几行,这样就不需要创建一个名为 populateJSON 的新函数

var myApp = {
init: function () {
    $.getJSON('data/spelling.json').done(function(data) {
        myApp.regularNameErrors = data;
    });
},
regularNameErrors: {},
};
于 2013-10-04T09:53:33.287 回答