В приложении на основе jsviews у меня есть объект данных, который содержит атрибут типа (фактически тип сервера).
Я хотел бы преобразовать его и добавить суффикс для перехода к включению tmpl.
Допустим, у меня есть:
$.views.converters({
"serverSideTypeToLocalType": function(serverSideType) {
switch(serverSideType) {
case "server-side-type1":
return "type1";
case "server-side-type2":
return "type2";
case "server-side-type3":
return "type3";
default:
throw "Invalid type";
}
}
});
У меня также есть шаблоны:
<script type="text/x-jsrender" id"type1-edit">
template for editing type 1
</script>
<script type="text/x-jsrender" id"type1-view">
template for viewing type 1
</script><script type="text/x-jsrender" id"type2-edit">
template for editing type 2
</script>
<script type="text/x-jsrender" id"type2-view">
template for viewing type 2
</script><script type="text/x-jsrender" id"type3-edit">
template for editing type 3
</script>
<script type="text/x-jsrender" id"type3-view">
template for viewing type 3
</script>
Мой объект данных:
var data = { MyObjects : [
{
"ServerSideType": "server-side-type1",
"IsEditing" : true
},{
"ServerSideType": "server-side-type2",
"IsEditing" : false
}] };
Как создать основной шаблон, который динамически включает правильный шаблон на основе свойств ServerSideType
и IsEditing
?
Я пытался:
<div>
{^{for MyObjects}}
{^{include ^tmpl=({serverSideTypeToLocalType:ServerSideType}+ "-" + IsEditing ? "edit":"view")/}}
{{/for}}
</div>
, но это приводит к странной ошибке Cannot read property 'bd' of undefined
.
Вот воспроизводимый образец:
(function($) {
$(function() {
$.views.converters({
"serverSideTypeToLocalType": function(serverSideType) {
switch (serverSideType) {
case "server-side-type1":
return "type1";
case "server-side-type2":
return "type2";
case "server-side-type3":
return "type3";
default:
throw "Invalid type";
}
}
});
var data = {
MyObjects: [{
"ServerSideType": "server-side-type1",
"IsEditing": true
}, {
"ServerSideType": "server-side-type2",
"IsEditing": false
}]
};
var tmpl = $.templates("#main");
tmpl.link("#container", data);
});
})(jQuery);
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jsviews/0.9.90/jsviews.min.js"></script>
<script type="text/x-jsrender" id="main">
<div>
{^{for MyObjects}}
<p>Object n° {^{:#index +1}}</p>
{^{include ^tmpl=({serverSideTypeToLocalType:ServerSideType}+ "-" + IsEditing ? "edit":"view")/}}
{{/for}}
</div>
</script>
<script type="text/x-jsrender" id="type1-edit">
<div>
template for editing type 1
</div>
</script>
<script type="text/x-jsrender" id="type1-view">
<div>
template for viewing type 1
</div>
</script>
<script type="text/x-jsrender" id="type2-edit">
<div>
template for editing type 2
</div>
</script>
<script type="text/x-jsrender" id="type2-view">
<div>
template for viewing type 2
</div>
</script>
<script type="text/x-jsrender" id="type3-edit">
<div>
template for editing type 3
</div>
</script>
<script type="text/x-jsrender" id="type3-view">
<div>
template for viewing type 3
</div>
</script>
<div id="container">Loading ...</div>