我有一个简单的Handlebars助手,可以简单地格式化金钱价值。当我使用静态数据进行测试时,帮助程序工作属性,但是当我异步加载数据时则不行。换句话说,{{totalBillable}}将输出预期金额,但{{money totalBillable}}将输出零。但只有当数据通过ajax调用加载时。我到底做错了什么?
我试图尽可能地减少代码,并在这里创建了一个jsfiddle: http://jsfiddle.net/Gjunkie/wsZXN/2/
这是一个Ember应用程序:
App = Ember.Application.create({});
这是把手助手:
Handlebars.registerHelper("money", function(path) {
var value = Ember.getPath(this, path);
return parseFloat(value).toFixed(2);
});
型号:
App.ContractModel = Ember.Object.extend({});
App Controller:
App.appController = Ember.Object.create({
proprietor: null,
});
Contracts Controller(管理一系列合约):
App.contractsController = Ember.ArrayController.create({
content: [],
totalBillable: function() {
var arr = this.get("content");
return arr.reduce(function(v, el){
return v + el.get("hourlyRate");
}, 0);
}.property("content"),
当所有者更改时,使用ajax请求获取新的合同数据。异步获取数据时,把手助手不起作用。
proprietorChanged: function() {
var prop = App.appController.get("proprietor");
if (prop) {
$.ajax({
type: "POST",
url: '/echo/json/',
data: {
json: "[{\"hourlyRate\":45.0000}]",
delay: 1
},
success: function(data) {
data = data.map(function(item) {
return App.ContractModel.create(item);
});
App.contractsController.set("content", data);
}
});
}
else {
this.set("content", []);
}
}.observes("App.appController.proprietor")
});
如果我使用此版本,那么Handlebars帮助程序将按预期工作:
proprietorChanged: function() {
var prop = App.appController.get("proprietor");
if (prop) {
var data = [{
"hourlyRate": 45.0000}];
data = data.map(function(item) {
return App.ContractModel.create(item);
});
App.contractsController.set("content", data);
}
else {
this.set("content", []);
}
}.observes("App.appController.proprietor")
查看:
App.OverviewTabView = Ember.TabPaneView.extend({
totalBillableBinding: "App.contractsController.totalBillable"
});
通过设置所有者来解决问题
App.appController.set("proprietor", {
ID: 1,
name: "Acme"
});
模板:
<script type="text/x-handlebars">
{{#view App.OverviewView viewName="overview"}}
<div class="summary">
Total Billable: {{totalBillable}}<br/>
Total Billable: {{money totalBillable}}<br/>
</div>
{{/view}}
</script>
答案 0 :(得分:8)
使用帮助器时,把手不会在助手调用周围发出变形标签。这样,模板的这一部分不会重新渲染,因为没有绑定
手动绑定要重新渲染的模板的一部分,您可以使用bind
帮助器:
<script type="text/x-handlebars">
{{#view App.OverviewView viewName="overview"}}
<div class="summary">
Total Billable: {{totalBillable}}<br/>
Total Billable: {{#bind totalBillable}}{{money this}}{{/bind}}<br/>
</div>
{{/view}}
</script>