2011-11-05 85 views
0

我已經開始考慮使用淘汰賽來爲我的團隊使用;到目前爲止,我對這個框架非常滿意,除了它與jQuery模板插件的關係外,它的語法我討厭。另外(更重要的是),我們一直在使用jQote2進行客戶端模板化,所以我想研究創建一個使用它的模板引擎。jQote2淘汰賽模板

我對renderTemplate函數有困難; jQote2庫似乎不知道如何找到通過參數data傳入的變量。有沒有人處理過這種事情?我假設它更是一個jQote2怪癖比淘汰賽如何呈現其模板什麼的......

代碼:

jqoteTemplateEngine = function() { 
    var templates = {}; 

    this.createJavaScriptEvaluatorBlock = function (script) { 
     return '<%= ' + script + ' %>'; 
    } 

    this.getTemplateNode = function (template) { 
     var templateNode = document.getElementById(template); 
     if (templateNode == null) 
      throw new Error("Cannot find template with ID of " + template); 
     return templateNode; 
    } 

    this.renderTemplate = function(templateId, data, options) { 
     var renderedMarkup = jQuery.jqote(templates[templateId], data); 

     return ko.utils.parseHtmlFragment(renderedMarkup); 
    } 

    this.rewriteTemplate = function (template, rewriterCallback) { 
     var templateNode = this.getTemplateNode(template); 

     templates[template] = rewriterCallback(templateNode.text); 
    } 

    this.isTemplateRewritten = function (templateId) { 
     return templateId in templates; 
    } 
}; 

jqoteTemplateEngine.prototype = new ko.templateEngine(); 

ko.setTemplateEngine(new jqoteTemplateEngine()); 

,要點是:http://gist.github.com/1341737

回答

2

我會看看KO 1.3 。它處於測試階段,但非常穩定。 1.3中兩件重要的事情。現在有了一個本地模板引擎,所以你可以選擇避免對外部模板引擎(甚至是jQuery)有任何依賴。與匿名模板的控制流綁定使這個更簡單的選項。其次,它簡化了自定義模板引擎的定義方式。所以,如果你仍然想使用外部引擎,那麼讓它工作起來更容易一些。

基本上,只需要定義一個renderTemplate方法和一個createJavaScriptEvaluatorBlock如果您希望能夠將數據綁定到可用於模板引擎的變量。其餘的定義在ko.templateEngine基礎「類」上。

所以,你的發動機可能只是看起來像:

ko.jqoteTemplateEngine = function() {}; 

ko.jqoteTemplateEngine.prototype = new ko.templateEngine(); 
ko.jqoteTemplateEngine.prototype.createJavaScriptEvaluatorBlock = function(script) { 
    return '<%= ' + script + ' %>'; 
}; 

ko.jqoteTemplateEngine.prototype.renderTemplateSource = function(templateSource, bindingContext, options) { 
    var templateText = templateSource.text(); 
    return ko.utils.parseHtmlFragment($.jqote(templateText, bindingContext.$data)); 
}; 

ko.setTemplateEngine(new ko.jqoteTemplateEngine()); 

這裏是使用一個樣本:http://jsfiddle.net/rniemeyer/yTzcF/

+0

優秀和全面的答案 - 非常感謝你。我的問題不在於我構建模板引擎,而在於使用模板本身(具體而言,我並不滿足jQote的期望)。你的例子引起了我的注意。 我將使用較新的模板樣式,但關於控制流綁定的位應該是無價的... – egoodberry