在循环中引用 handlebars 变量
Referencing handlebars variable in a loop
我正在尝试使用编译模板在 Handlebars 中构建一些下拉菜单,但它无法访问我的变量:
车把:
{{#each options}}
<div class="control-group consumables-options">
<div class="row-fluid">
<div class="span2">
{{select 'task_services_options' ../bond_service_request_quantities quantity}}
</div>
</div>
</div>
{{/each}}
JS:
var html = Handlebars.templates.service_request_consumable_options({
bond_service_request_quantities: bond_quantities,
options: opts
});
其中 bond_quantities
和 opts
是对象数组。
select 助手来自 handlebars-form-helpers,但即使在普通车把 ({{../bond_service_request_quantities.0.text}}
) 中,我也会收到错误消息。
Uncaught TypeError: Cannot read property '1' of undefined
您的 Handlebars 模板和 javascript 代码看起来不错。通过查看错误消息,变量 "bond_quantities" 似乎为空。
这是我用来测试您的代码的示例 html 文件。我尽量简化了,把预编译好的模板直接加到页面上,硬编码数据。
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.3.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0/handlebars.js"></script>
<script src="handlebars.form-helpers.min.js"></script>
<script>
(function() {
var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
templates['service_request_consumable_options'] = template({"1":function(depth0,helpers,partials,data,blockParams,depths) {
depths = [];
depths[1] = data.root;
return "<div class=\"control-group consumables-options\">\n <div class=\"row-fluid\">\n <div class=\"span2\">\n "
+ this.escapeExpression((helpers.select || (depth0 && depth0.select) || helpers.helperMissing).call(depth0,"task_services_options",(depths[1] != null ? depths[1].bond_service_request_quantities : depths[1]),(depth0 != null ? depth0.quantity : depth0),{"name":"select","hash":{},"data":data}))
+ "\n </div>\n </div>\n</div>\n";
},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,blockParams,depths) {
var stack1;
return ((stack1 = helpers.each.call(depth0,(depth0 != null ? depth0.options : depth0),{"name":"each","hash":{},"fn":this.program(1, data, 0, blockParams, depths),"inverse":this.noop,"data":data})) != null ? stack1 : "");
},"useData":true,"useDepths":true});
})();
</script>
<script>
$(function() {
HandlebarsFormHelpers.register(Handlebars);
var bond_quantities = [ {
value : 1,
text : 'One'
}, {
value : 2,
text : 'Two'
} ];
var opts = [ {
quantity : 100
}, {
quantity : 200
} ];
var html = Handlebars.templates.service_request_consumable_options({
bond_service_request_quantities: bond_quantities,
options: opts
});
$('#target').html(html);
});
</script>
</head>
<body>
<div id="target"></div>
</body>
</html>
我的回答是我使用了两个不同版本的 Handlebars。该项目有 v2.0.0,但 npm 安装了 3.0.3 用于编译模板的 grunt 任务。
我正在尝试使用编译模板在 Handlebars 中构建一些下拉菜单,但它无法访问我的变量:
车把:
{{#each options}}
<div class="control-group consumables-options">
<div class="row-fluid">
<div class="span2">
{{select 'task_services_options' ../bond_service_request_quantities quantity}}
</div>
</div>
</div>
{{/each}}
JS:
var html = Handlebars.templates.service_request_consumable_options({
bond_service_request_quantities: bond_quantities,
options: opts
});
其中 bond_quantities
和 opts
是对象数组。
select 助手来自 handlebars-form-helpers,但即使在普通车把 ({{../bond_service_request_quantities.0.text}}
) 中,我也会收到错误消息。
Uncaught TypeError: Cannot read property '1' of undefined
您的 Handlebars 模板和 javascript 代码看起来不错。通过查看错误消息,变量 "bond_quantities" 似乎为空。
这是我用来测试您的代码的示例 html 文件。我尽量简化了,把预编译好的模板直接加到页面上,硬编码数据。
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.3.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0/handlebars.js"></script>
<script src="handlebars.form-helpers.min.js"></script>
<script>
(function() {
var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
templates['service_request_consumable_options'] = template({"1":function(depth0,helpers,partials,data,blockParams,depths) {
depths = [];
depths[1] = data.root;
return "<div class=\"control-group consumables-options\">\n <div class=\"row-fluid\">\n <div class=\"span2\">\n "
+ this.escapeExpression((helpers.select || (depth0 && depth0.select) || helpers.helperMissing).call(depth0,"task_services_options",(depths[1] != null ? depths[1].bond_service_request_quantities : depths[1]),(depth0 != null ? depth0.quantity : depth0),{"name":"select","hash":{},"data":data}))
+ "\n </div>\n </div>\n</div>\n";
},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data,blockParams,depths) {
var stack1;
return ((stack1 = helpers.each.call(depth0,(depth0 != null ? depth0.options : depth0),{"name":"each","hash":{},"fn":this.program(1, data, 0, blockParams, depths),"inverse":this.noop,"data":data})) != null ? stack1 : "");
},"useData":true,"useDepths":true});
})();
</script>
<script>
$(function() {
HandlebarsFormHelpers.register(Handlebars);
var bond_quantities = [ {
value : 1,
text : 'One'
}, {
value : 2,
text : 'Two'
} ];
var opts = [ {
quantity : 100
}, {
quantity : 200
} ];
var html = Handlebars.templates.service_request_consumable_options({
bond_service_request_quantities: bond_quantities,
options: opts
});
$('#target').html(html);
});
</script>
</head>
<body>
<div id="target"></div>
</body>
</html>
我的回答是我使用了两个不同版本的 Handlebars。该项目有 v2.0.0,但 npm 安装了 3.0.3 用于编译模板的 grunt 任务。