我有一个jQuery插件,可以通过ajax调用加载json数据 - 返回的数据被插入到现有对象中。
当我尝试引用新插入的节点时,我得到一个“未定义” - 虽然数据在控制台中看起来很好。
如果我手动定义数据,那么我可以很好地访问它 - 即使结构是相同的。
数据加载到init事件上(.then()中会有多个函数调用,但我只是显示失败的初始调用 - 每个调用都会引用相同的_t.criteria.base。 x其中x是插入的json):
var _t = this;
_t.init = function() {
_s = $.extend({}, defaults, options);
$.when(
loadDefaultCriteria()
).then(
renderCommunities
);
}
这会加载数据:
_t.criteria = {
base: {},
current: {},
picks:{}
};
var loadDefaultCriteria = function() {
$.getJSON
(
'/path/to/script.php',
{
action: 'loadDefaultCriteria',
})
.done( function( data ){
_t.criteria.base = data;
})
.fail( function( jqxhr, textStatus, error ) {
var err = textStatus + ", " + error;
console.log( "Request Failed: " + err );
});
}
这是失败的代码(调试日志仍然存在)
var renderCommunities = function(){
console.log(_t.criteria);
var c = $(_s.containers.communities);
var i = _t.criteria.base.communities;
console.log(i);
c.empty();
c.append('<ul>');
$.each( i, function( idx, _i ) {
console.log(_i);
});
}
console.log(_t.criteria)输出(我只显示基础对象的展开树):
Object {base: Object, current: Object, picks: Object}
base: Object
communities: Object
subscribed: Array[2]
0: Object
1: Object
unsubscribed: Array[1]
0: Object
current: Object
picks: Object
无论我尝试在哪个对象并在下面引用它们都返回'undefined',所以在上面的代码中,console.log(_t.base.communities)将返回undefined。
如何将JSON数据/节点的子集插入现有对象然后访问它们?
答案 0 :(得分:0)
$.when
期望Deferred对象作为其参数。现在,loadDefaultCriteria
不会返回任何内容,因此$.when
将undefined
作为其参数。相反,loadDefaultCriteria
必须return
由$.getJSON(...)
调用创建的延迟对象:
var loadDefaultCriteria = function() {
return $.getJSON( ... );
}
您的renderCommunities
来电已在getJSON
来电完成之前发生。您的console.log
调用显示更新对象的原因是因为您在强制$.getJSON
调用后console.log
always shows the object as it exists at inspection time检查了已记录的对象。事件的顺序是:
getJSON
loadDefaultCriteria
来电
renderCommunities
$.getJSON
解析并更新对象