2011-11-05 90 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