JQuery TMPL в закрытии - PullRequest
       10

JQuery TMPL в закрытии

2 голосов
/ 28 июня 2011

Я работаю над этой маленькой библиотекой javascript и, следуя различным предложениям, оборачиваю свою функциональность в замыкание по разным причинам (инкапсуляция переменных, скрытие кода и т. Д.).так как я запрашиваю веб-сервис JSON и отображаю результаты, я также использую движок 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 и переменная bar).Поэтому, когда я звоню $.tmpl, я надеялся, что attribute.filter(isBar) в шаблоне также будет в этой области.но это не так.Я Chrome, я получаю ReferenceError: isBar is not defined.
Если бы кто-то был бы так рад показать мне ошибку моего пути, я был бы очень счастлив.

1 Ответ

2 голосов
/ 28 июня 2011

edit упс Я пропустил "()".

Хорошо, проблема в том, что эти ссылки на локальные переменные в замыкании на самом деле не являются ссылками на локальные переменные - ониты часть строки .Код шаблона должен анализировать эту строку, поэтому, когда это происходит, факт, что в замыкании была функция с именем isBar (), из которой вызывался $ .tmpl (), действительно не имеет значения;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()} "внутри текста шаблона.

...