即使使用闭包,也无法将数据传递给getJSON

时间:2016-02-05 06:41:03

标签: javascript jquery json closures

我在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']);
                    }
                }
            })
        );

    }

我的代码出了什么问题?谢谢!

2 个答案:

答案 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));
    }