Chr*_*ing 2 javascript handlebars.js ember.js
我有一个简单的Handlebars帮助器,只需格式化货币价值.当我使用静态数据进行测试时,帮助程序工作属性,但是当我异步加载数据时则不行.换句话说,{{totalBillable}}将输出预期金额,但{{money totalBillable}}将输出零.但只有当数据通过ajax调用加载时.我到底做错了什么?
我试图尽可能地减少代码,并在这里创建了一个jsfiddle:http: //jsfiddle.net/Gjunkie/wsZXN/2/
这是一个Ember应用程序:
App = Ember.Application.create({});
Run Code Online (Sandbox Code Playgroud)
这是车把助手:
Handlebars.registerHelper("money", function(path) {
var value = Ember.getPath(this, path);
return parseFloat(value).toFixed(2);
});
Run Code Online (Sandbox Code Playgroud)
模型:
App.ContractModel = Ember.Object.extend({});
Run Code Online (Sandbox Code Playgroud)
应用控制器:
App.appController = Ember.Object.create({
proprietor: null,
});
Run Code Online (Sandbox Code Playgroud)
合同控制器(管理一系列合同):
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"),
Run Code Online (Sandbox Code Playgroud)
当所有者更改时,使用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")
});
Run Code Online (Sandbox Code Playgroud)
如果我使用此版本,那么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")
Run Code Online (Sandbox Code Playgroud)
视图:
App.OverviewTabView = Ember.TabPaneView.extend({
totalBillableBinding: "App.contractsController.totalBillable"
});
Run Code Online (Sandbox Code Playgroud)
通过设置一个东主来解决问题
App.appController.set("proprietor", {
ID: 1,
name: "Acme"
});
Run Code Online (Sandbox Code Playgroud)
模板:
<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>
Run Code Online (Sandbox Code Playgroud)
使用帮助器时,把手不会在助手调用周围发出变形标签.这样,模板的这一部分不会重新渲染,因为没有绑定
要手动绑定要重新呈现的模板的一部分,您可以使用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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4041 次 |
| 最近记录: |