我是 jsrender 的新手。我已经为一个带有脚本标记的自定义树视图编写了模板,请参见上面:
<script id="jstemplate" type="text/x-jsrender">
{{if IsFolder}}{{include tmpl="#jsfoldertemplate"/}}{{else}}{{include tmpl="#jsfiletemplate"/}}{{/if}}
</script>
<script id="jsfoldertemplate" type="text/x-jsrender">
<li data-jstree='{"type":"{{:ClassName}}"}' data-fold="{{:IsFolder}}" data-path="{{:RP}}">{{:Nom}} <span style="font-size:smaller">({{:Size}} {{:NbFiles}} fichier(s)) <span>{{:Lock}}</span></span>
<ul>
{{for children tmpl="#jstemplate"/}}
</ul>
</li>
</script>
<script id="jsfiletemplate" type="text/x-jsrender">
<li data-jstree='{"type":"{{:ClassName}}"}' data-fold="{{:IsFolder}}" data-path="{{:RP}}">
<span {{:InspectorInfo}} class="SpanEtat {{:Inspector}}"></span>
<span class="ui-link" onclick="$get('<%=Me.ClientID%>').FileSelected('{{:RP}}','{{:Nom}}');" style="vertical-align:middle">{{:Nom}}</span>
<span style="font-size:smaller">({{:Size}} {{:LastModif}}) <span>{{:Lock}}</span></span>
</li>
</script>
Run Code Online (Sandbox Code Playgroud)
在我的 js 代码中:
$(#MyDiv').html('<ul>' + $('#jstemplate').render(NO.Nodes) + '</ul>');
Run Code Online (Sandbox Code Playgroud)
没问题
现在我想把这个模板放在一个字符串中(用于编写 jqm 小部件),但我对子模板变得疯狂......
我尝试了很多解决方案但没有任何效果......
如果有人有任何想法......?
谢谢
在回答有关从字符串编译模板的问题之前,这里有一个简化“jstemplate”的建议:
代替
{{if IsFolder}}{{include tmpl="#jsfoldertemplate"/}}{{else}}{{include tmpl="#jsfiletemplate"/}}{{/if}}
Run Code Online (Sandbox Code Playgroud)
你可以写:
{{if IsFolder tmpl="#jsfoldertemplate"}}{{else tmpl="#jsfiletemplate"}}{{/if}}
Run Code Online (Sandbox Code Playgroud)
要从字符串注册模板,请查看此页面:http://www.jsviews.com/#d.templates。您将看到有关“注册多个模板”的部分和示例。
按照该模式,您可以从字符串将所有三个模板注册为命名模板:
$.templates({
jstemplate: '{{if IsFolder tmpl="jsfoldertemplate"}}{{else tmpl="jsfiletemplate"}}{{/if}}',
jsfoldertemplate: '<li data-jstree=\'{"type":"{{:ClassName}}"}\' data-fold="{{:IsFolder}}" data-path="{{:RP}}">{{:Nom}} <span style="font-size:smaller">({{:Size}} {{:NbFiles}} fichier(s)) <span>{{:Lock}}</span></span>'
+ '<ul>{{for children tmpl="jstemplate"/}}</ul></li>',
jsfiletemplate: '<li data-jstree=\'{"type":"{{:ClassName}}"}\' data-fold="{{:IsFolder}}" data-path="{{:RP}}">'
+ '<span {{:InspectorInfo}} class="SpanEtat {{:Inspector}}"></span> '
+ '<span class="ui-link" onclick="$get(\'<%=Me.ClientID%>\').FileSelected(\'{{:RP}}\',\'{{:Nom}}\');" style="vertical-align:middle">{{:Nom}}</span> '
+ '<span style="font-size:smaller">({{:Size}} {{:LastModif}}) <span>{{:Lock}}</span></span></li>'
});
Run Code Online (Sandbox Code Playgroud)
然后调用:
$('#MyDiv').html('<ul>' + $.render.jstemplate(NO.Nodes) + '</ul>');
Run Code Online (Sandbox Code Playgroud)
或者,如果您不想全局注册模板,则可以将第二个和第三个模板注册为第一个模板的子模板,第一个模板可以编译为模板对象,而无需按名称注册。为了从子模板中递归调用第一个模板,您可以按名称仅注册第一个模板,并将其调用为,{{for children tmpl="jstemplate"/}}
或者仅将其保留为对象,但将该jstemplate
对象作为 helper:jstemplate.render(NO.Nodes, {jstemplate: jstemplate})
传入,然后调用像这样:{{for children tmpl=~jstemplate/}}
(请参阅同一页面:http://www.jsviews.com/#d.templates -将私有资源与模板关联部分。)
这给你:
var jstemplate = $.templates({
markup: '{{if IsFolder tmpl="jsfoldertemplate"}}{{else tmpl="jsfiletemplate"}}{{/if}}',
templates: {
jsfoldertemplate: '<li data-jstree=\'{"type":"{{:ClassName}}"}\' data-fold="{{:IsFolder}}" data-path="{{:RP}}">{{:Nom}} <span style="font-size:smaller">({{:Size}} {{:NbFiles}} fichier(s)) <span>{{:Lock}}</span></span>'
+ '<ul>{{for children tmpl=~jstemplate/}}</ul></li>',
jsfiletemplate: '<li data-jstree=\'{"type":"{{:ClassName}}"}\' data-fold="{{:IsFolder}}" data-path="{{:RP}}">'
+ '<span {{:InspectorInfo}} class="SpanEtat {{:Inspector}}"></span> '
+ '<span class="ui-link" onclick="$get(\'<%=Me.ClientID%>\').FileSelected(\'{{:RP}}\',\'{{:Nom}}\');" style="vertical-align:middle">{{:Nom}}</span> '
+ '<span style="font-size:smaller">({{:Size}} {{:LastModif}}) <span>{{:Lock}}</span></span></li>'
}
})
$('#MyDiv').html('<ul>' + jstemplate.render(NO.Nodes, {jstemplate: jstemplate}) + '</ul>');
Run Code Online (Sandbox Code Playgroud)
这是另一个变体 - 我简化了模板,以便更容易地显示模板和初始模板的递归调用之间的关系。这里,初始模板被提供给子模板以作为模板参数进行递归调用:~toptmpl=#tmpl
然后使用以下命令进行调用{{for children tmpl=~toptmpl/}}
:
var jstemplate = $.templates({
markup: '{{if IsFolder tmpl="jsfoldertemplate" ~toptmpl=#tmpl}}{{else tmpl="jsfiletemplate"}}{{/if}}',
templates: {
jsfoldertemplate: '<li>{{:Nom}} fichiers<ul>{{for children tmpl=~toptmpl/}}</ul></li>',
jsfiletemplate: '<li>{{:Nom}}</li>',
}
});
$('#MyDiv').html('<ul>' + jstemplate.render(NO.Nodes) + '</ul>');
Run Code Online (Sandbox Code Playgroud)