我在SO上经历了很多解决这个问题的方法,不幸的是,它们都没有为我工作。
我想动态加载并在页面上放置一些元素。 HTML由其中一个脚本生成,生成的模板(用于将数据注入其中)传递给getJSON方法。我想在我的回调方法中填充该模板,然后将其添加到正文中。
问题是getJSON函数。我试图通过闭包和绑定传递面板值,但没有一个工作。
init: function(panel) {
// closure
$.getJSON("scripts/getZones.php",
(function () { // closure
var p = panel;
return function(zoneData) {
if (zoneData.status == true) {
$.each(zoneData.values, function(i, item) {
console.log("Module.Control_manual: Adding zone " + item.id);
// filling panel with data here - but panel is undefined
});
} else {
// error!
console.log("Module.Control_manual: Error: " + item['message']);
}
}
})
);
}
我的代码出了什么问题?谢谢!
答案 0 :(得分:1)
对于闭包,你必须执行你的函数,然后getJSON
函数才能获得正确的回调函数
init: function(panel) {
// closure
$.getJSON("scripts/getZones.php",
// closure, you must execute it first, then the `getJSON` function could get the right callback function
(function() {
var p = panel;
return function(zoneData) {
if (zoneData.status == true) {
$.each(zoneData.values, function(i, item) {
console.log("Module.Control_manual: Adding zone " + item.id);
});
} else {
// error!
console.log("Module.Control_manual: Error: " + item['message']);
}
}
}());
);
}
此外,当你想存储panel
时,你应该只采用这种封闭方式,否则你只需使用面板而不是回调。
答案 1 :(得分:0)
或者你可以使用bind方法将参数传递给回调函数,如下所示:
function doAfterJson(panel){
var p = panel;
return function(zoneData) {
if (zoneData.status == true) {
$.each(zoneData.values, function(i, item) {
console.log("Module.Control_manual: Adding zone " + item.id);
// filling panel with data here - but panel is undefined
});
} else {
// error!
console.log("Module.Control_manual: Error: " + item['message']);
}
}
}
}
//use 'bind(scope,parameter)' to pass scope and parameter to callback function
init: function(panel) {
// closure
$.getJSON("scripts/getZones.php",doAfterJson.bind(this,panel));
}