我正在尝试构建一个名为myApp的应用程序,它具有属性regularNameErrors和方法populateJSON,它使用AJAX调用来获取JSON对象,然后将该JSON对象添加到声明为该方法的参数之一的属性中。
获取数据的功能肯定有效,因为位置3的警报给出了正确的键列表。但是1处的警报返回undefined,警报处于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();
},
};
答案 0 :(得分:0)
由于能够使用返回的getJSON对象的延迟属性,函数可以减少到几行,这样就不必创建一个名为populateJSON的新函数
var myApp = {
init: function () {
$.getJSON('data/spelling.json').done(function(data) {
myApp.regularNameErrors = data;
});
},
regularNameErrors: {},
};
答案 1 :(得分: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
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
});
}
};