使用帮助程序或自定义标记动态分配基于数据的不同模板

时间:2016-02-25 12:29:57

标签: jquery-templates jsrender

我在模板对象中渲染jsrender模板。

var colorTmpl = {
     "color": jQuery.templates("<span>{{:~val}}</span>"),
}
var jsrendertmpl = {};
jQuery.extend(jsrendertmpl, colorTmpl);

如果我访问jsrendertmpl.colorTmpl.render(),它将呈现颜色模板。如果我将此tmpl模板标记包含在此类

之类的其他模板中
{colorArr: ["white", "blue", "black"]}

{{for colorArr tmpl="jsrendertmpl.colorTmpl"/}} 

它不会将子模板包含在父模板中。 因此,我添加了一个自定义标记,以在对象

中包含此子模板
includetmpl: function(tmplname){
            return Template.render(tmplVal, jObj);
},

如果我在父模板中包含子模板{{:~val}}无法识别

  

包含自定义包含标记的父模板

{{for colorArr itemVar='~val'}}
      {{includetmpl "color"}}
{{/for}}
  

没有子模板的父模板(工作正常)

{{for colorArr itemVar='~val'}}
      <span>{{:~val}}</span>
{{/for}}

有没有办法访问该值。我使用{{setvar}}和{{:~getvar}}进行解决,但需要永久解决方案。

提前致谢。

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现该方案 - 即根据您传入的数据参数提供不同的模板。

例如,您可以将模板作为帮助程序传递:

$.views.helpers("myTemplates", {
    color: $.templates("<span>{{:}}</span>"),
    colorVal: $.templates("<span>{{:~val}}</span>")
});

并在

中使用它
{{for colorArr tmpl=~myTemplates.color/}}

tmplVar是您选择的模板:“color”

{{for colorArr tmpl=~myTemplates[tmplVar]/}}

您也可以通过以下任一方式创建自定义标记:

$.views.tags("includetmpl", {
    init: function(tagCtx) {
        this.template = myTemplates[tagCtx.props.template];
    }
});

$.views.tags("includetmpl2", {
    render: function(val) {
        return myTemplates[this.tagCtx.props.template].render(val, this.ctx);
    }
});

(注意我如何将上下文传递给我的渲染函数,在第二个版本中,以便~val可用...)

然后按以下方式使用它:

{{for colorArr}}{{includetmpl template="color"/}}{{/for}}

{{for colorArr itemVar="~val"}}{{includetmpl template="colorVal"/}}{{/for}}

有关以上所有内容,请参阅https://jsfiddle.net/BorisMoore/coezx8xj/ ...

我会更改你问题的标题以使其更清晰。