在for循环中根据鉴别器字段加载不同的模板
Loading different templates based on discriminator field in for loop
我正在尝试在 jsrender 模板的 for 循环中加载不同的模板。
我尝试了不同的语法但没有成功。我尝试在 {{for fields tmpl="helperMethod()"}} 中加载模板,并将其包含在循环中。但是到现在都没有成功。
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsrender/1.0.5/jsrender.js"></script>
<script type="text/javascript" src="form.js"></script>
<title>Insert title here</title>
</head>
<body>
<div id="formbody">
</div>
<form name="submit()">
<input name = "nitin" value="" placeholder="Put name">
<input name = "password" value="" placeholder="Put password" type='password'>
</form>
</body>
</html>
<script id="formTemplate" type="text/x-jsrender">
<form id={{:id}}>
{{for steps tmpl="#stepTemplate"}}
{{/for}}
</form>
</script>
<script id="stepTemplate" type="text/x-jsrender">
<div id={{:id}} data-order={{:order}}>
<span><h2>{{:title}}</h2></span>
<div id="dynamic-field-div">
{{for fields tmpl="#"+~loadTemplate(:mytype)/}}
</div>
</div>
</script>
<script id="field-input-template" type="text/x-jsrender">
<span>{{:type}}</span>
<span>{{:templateOptions.label}}</span>
<input name = {{:key}} id={{:id}} field-order={{:#index}} {{if templateOptions.hint != null && templateOptions.hint != "" }} placeHolder={{:templateOptions.hint}} {{/if}}>
</script>
<script id="field-password-template" type="text/x-jsrender">
<span>{{:label}}</span>
<input name = {{:key}} id={{:id}} field-order={{:#index}} type="password">
</script>
$(document).ready(function(){
var formDescription = {
"id":"loginForm",
"steps": [
{
"id": "step_0",
"order": 0,
"title": "Personal Details",
"fields": [
{
"key": "firstName",
"templateOptions": {
"label": "First Name",
"hint": "enter first name"
},
"mytype":"input"
},
{
"key": "lastName",
"templateOptions": {
"label": "Last Name"
},
"mytype":"password"
}
]
},
{
"id": "step_1",
"order": 1,
"title": "Business Details",
"fields": [
{
"key": "email",
"templateOptions": {
"label": "First Name",
"hint": "input first name"
},
"mytype":"input"
},
{
"key": "mobile",
"templateOptions": {
"label": "Last Name",
"hint": "input last name"
},
"mytype":"password"
}
]
}
]
};
var templateObjects = $.templates({
stepTmpl: "#stepTemplate",
formTmpl: "#formTemplate"
});
function loadTemplateFromType(type) {
console.log(type);
return "field-"+type+"-template";
}
var myHelpers = {"loadTemplate": loadTemplateFromType};
$.views.helpers(myHelpers);
function appendToDom() {
$('#formbody').append(generateFormHTML());
}
function generateFormHTML() {
console.log("in generate");
var formHtml = $.render.formTmpl(formDescription);
return formHtml;
}
appendToDom();
});
这是我在控制台上看到的错误消息。
message
:
"Syntax error↵Compiled template code:↵↵// stepTmpl↵var v,t=j._tag,ret=""↵+"\n<div id=";↵try{↵ret+=((v=data.id)!=null?v:"");↵}catch(e){ret+=j._err(e,view,undefined);}ret=ret↵+" data-order=";↵try{↵ret+=((v=data.order)!=null?v:"");↵}catch(e){ret+=j._err(e,view,undefined);}ret=ret↵+">\n <span><h2>";↵try{↵ret+=((v=data.title)!=null?v:"");↵}catch(e){ret+=j._err(e,view,undefined);}ret=ret↵+"</h2></span>\n <div id=\"dynamic-field-div\">\n ";↵try{↵ret+=t("for",view,this,[↵{view:view,content:false,tmpl:false,↵ params:{args:['fields'],↵ props:{'tmpl':'\"#\"+~loadTemplate(:mytype)'}},↵ args:[data.fields],↵ props:{'tmpl':"#"+view.ctxPrm("loadTemplate")(:data.mytype)}}]);↵}catch(e){ret+=j._err(e,view,undefined);}ret=ret↵+"\n </div>\n</div>\n";↵return ret;↵: "Unexpected token :""
name:"JsRender Error"
}
有争议的代码中index.html中的"stepTemplate"中的for循环。如果我从“:mytype”中删除“:”,那么它只会在浏览器中打印表达式。
问题在于
{{for fields tmpl="#"+~loadTemplate(mytype)/}}
这将使用 ~loadTemplate(mytype)
返回的模板,并使用该模板迭代字段。您想要遍历字段,并根据字段对象上的 mytype
值对每个字段使用不同的模板。
你可以这样做:
{{for fields}}{{include tmpl="#"+~loadTemplate(mytype)/}}{{/for}}
我正在尝试在 jsrender 模板的 for 循环中加载不同的模板。
我尝试了不同的语法但没有成功。我尝试在 {{for fields tmpl="helperMethod()"}} 中加载模板,并将其包含在循环中。但是到现在都没有成功。
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsrender/1.0.5/jsrender.js"></script>
<script type="text/javascript" src="form.js"></script>
<title>Insert title here</title>
</head>
<body>
<div id="formbody">
</div>
<form name="submit()">
<input name = "nitin" value="" placeholder="Put name">
<input name = "password" value="" placeholder="Put password" type='password'>
</form>
</body>
</html>
<script id="formTemplate" type="text/x-jsrender">
<form id={{:id}}>
{{for steps tmpl="#stepTemplate"}}
{{/for}}
</form>
</script>
<script id="stepTemplate" type="text/x-jsrender">
<div id={{:id}} data-order={{:order}}>
<span><h2>{{:title}}</h2></span>
<div id="dynamic-field-div">
{{for fields tmpl="#"+~loadTemplate(:mytype)/}}
</div>
</div>
</script>
<script id="field-input-template" type="text/x-jsrender">
<span>{{:type}}</span>
<span>{{:templateOptions.label}}</span>
<input name = {{:key}} id={{:id}} field-order={{:#index}} {{if templateOptions.hint != null && templateOptions.hint != "" }} placeHolder={{:templateOptions.hint}} {{/if}}>
</script>
<script id="field-password-template" type="text/x-jsrender">
<span>{{:label}}</span>
<input name = {{:key}} id={{:id}} field-order={{:#index}} type="password">
</script>
$(document).ready(function(){
var formDescription = {
"id":"loginForm",
"steps": [
{
"id": "step_0",
"order": 0,
"title": "Personal Details",
"fields": [
{
"key": "firstName",
"templateOptions": {
"label": "First Name",
"hint": "enter first name"
},
"mytype":"input"
},
{
"key": "lastName",
"templateOptions": {
"label": "Last Name"
},
"mytype":"password"
}
]
},
{
"id": "step_1",
"order": 1,
"title": "Business Details",
"fields": [
{
"key": "email",
"templateOptions": {
"label": "First Name",
"hint": "input first name"
},
"mytype":"input"
},
{
"key": "mobile",
"templateOptions": {
"label": "Last Name",
"hint": "input last name"
},
"mytype":"password"
}
]
}
]
};
var templateObjects = $.templates({
stepTmpl: "#stepTemplate",
formTmpl: "#formTemplate"
});
function loadTemplateFromType(type) {
console.log(type);
return "field-"+type+"-template";
}
var myHelpers = {"loadTemplate": loadTemplateFromType};
$.views.helpers(myHelpers);
function appendToDom() {
$('#formbody').append(generateFormHTML());
}
function generateFormHTML() {
console.log("in generate");
var formHtml = $.render.formTmpl(formDescription);
return formHtml;
}
appendToDom();
});
这是我在控制台上看到的错误消息。
message
:
"Syntax error↵Compiled template code:↵↵// stepTmpl↵var v,t=j._tag,ret=""↵+"\n<div id=";↵try{↵ret+=((v=data.id)!=null?v:"");↵}catch(e){ret+=j._err(e,view,undefined);}ret=ret↵+" data-order=";↵try{↵ret+=((v=data.order)!=null?v:"");↵}catch(e){ret+=j._err(e,view,undefined);}ret=ret↵+">\n <span><h2>";↵try{↵ret+=((v=data.title)!=null?v:"");↵}catch(e){ret+=j._err(e,view,undefined);}ret=ret↵+"</h2></span>\n <div id=\"dynamic-field-div\">\n ";↵try{↵ret+=t("for",view,this,[↵{view:view,content:false,tmpl:false,↵ params:{args:['fields'],↵ props:{'tmpl':'\"#\"+~loadTemplate(:mytype)'}},↵ args:[data.fields],↵ props:{'tmpl':"#"+view.ctxPrm("loadTemplate")(:data.mytype)}}]);↵}catch(e){ret+=j._err(e,view,undefined);}ret=ret↵+"\n </div>\n</div>\n";↵return ret;↵: "Unexpected token :""
name:"JsRender Error"
}
有争议的代码中index.html中的"stepTemplate"中的for循环。如果我从“:mytype”中删除“:”,那么它只会在浏览器中打印表达式。
问题在于
{{for fields tmpl="#"+~loadTemplate(mytype)/}}
这将使用 ~loadTemplate(mytype)
返回的模板,并使用该模板迭代字段。您想要遍历字段,并根据字段对象上的 mytype
值对每个字段使用不同的模板。
你可以这样做:
{{for fields}}{{include tmpl="#"+~loadTemplate(mytype)/}}{{/for}}