闭包中的jquery tmpl

时间:2011-06-28 15:27:15

标签: javascript closures jquery-templates

我正在研究这个小javascript库,并遵循各种建议,我将我的功能包装在一个闭包中,原因有各种(变量的封装,代码的隐藏等等)。因为我查询JSON Web服务并显示结果,所以我也使用jquery tmpl引擎 我想我明白什么是关闭有利但我确定一般都不理解它们。意思是我在所有范围变化和诸如此类的东西之间完全迷失了。特别烦人的是我得到的这个例外。考虑以下代码(有问题的代码的简化丑陋版本,但它再现了问题)

// something would be the object that handles all the library functionality
var something = function(){

    // creating a local function that goes as a parameter into the Array.filter
    function isBar(data){
        return data.name === "bar";
    }

    // the template code
    var bla = "<h1>${name}<\h1><h2>${attribute.filter(isBar)[0].value}</h2>";

    // precompiling the the template
    $.template("test", bla);

    // and returning a function that should render the template with the provided data
    return {
        funny: function(){
            $.tmpl("test", [{"name":"Fo", "attribute":[{"name":"bar", "value":"how"}]},
                            {"name":"Foo", "attribute":[{"name":"fnord","value":"can"}]},
                            {"name":"Fooo", "attribute":[{"name":"bar","value":"this"}]},
                            {"name":"Foooo", "attribute":[{"name":"Bar", "value":"be"}]}
            ]);
        }
    }
}();
// calling the function
something.funny();

因此,当调用something.funny()时,我希望发生以下情况:作为闭包的函数funny在其原始上下文中被调用(例如函数isBar和变量{ {1}}已定义)。因此,当我致电bar时,我希望模板中的$.tmpl也在此范围内。但它不是。我知道Chrome我attribute.filter(isBar) 如果有人愿意向我展示我的方式错误,我将非常高兴。

1 个答案:

答案 0 :(得分:2)

编辑 oops我错过了“()”。

好的,问题是关闭中对局部变量的引用实际上并不是对局部变量的引用 - 它们是字符串的一部分。模板代码必须解析该字符串,所以当它这样做时,在调用“$ .tmpl()”的闭包中有一个名为“isBar()”的函数的事实并不重要; jQuery无法访问它们,因为您无法在JavaScript中执行此操作。

然而,可以将“options”第三个参数传递给“$ .tmpl()”并在那里提供额外的东西。我不是100%肯定该怎么做,因为我只使用了模板插件一点点,但是当我有机会时我会尝试一个jsfiddle。我认为你基本上会做这样的事情:

    funny: function(){
        $.tmpl("test", [{"name":"Fo", "attribute":[{"name":"bar", "value":"how"}]},
                        {"name":"Foo", "attribute":[{"name":"fnord","value":"can"}]},
                        {"name":"Fooo", "attribute":[{"name":"bar","value":"this"}]},
                        {"name":"Foooo", "attribute":[{"name":"Bar", "value":"be"}]}
        ], { isBar: isBar });
    }

我不确定你是否在模板文本中将其称为“$ {isBar()}”或“$ {item.isBar()}”。