您可以像这样将模板附加到可用模板的对象上:
Ember.TEMPLATES.cow = Ember.Handlebars.compile("I'm a cow {{log this}}");
或者在你的情况下可能是这样的:
var url = 'hbs/about.hbs',
templateName = url.replace('.hbs', '');
Ember.$.ajax({
url: url,
async: false,
success: function (resp) {
Em.TEMPLATES[templateName] = Ember.Handlebars.compile(resp);
}
});
这是在应用程序中完成的一个惰性示例:
http://emberjs.jsbin.com/apIRef/1/edit
老实说,预先(服务器端)预编译模板对最终用户来说性能更高。
预编译获取原始的把手并将其转换为大量的 javascript 语句,以在构建视图时使用。
当 DOM 准备就绪时,Ember 会扫描 DOM 以查找类型为“text/x-handlebars”的脚本元素,并在其内容上调用 compile。然后,它将结果添加到Ember.TEMPLATES
具有来自 data-template-name 属性的名称的对象中。这会给应用程序增加一些完全不必要的加载时间。
例如,当我们发送“I'm a cow {{log this}}”时,它被转换为以下 javascript 方法
function anonymous(Handlebars,depth0,helpers,partials,data /**/) {
this.compilerInfo = [4,'>= 1.0.0'];
helpers = this.merge(helpers, Ember.Handlebars.helpers); data = data || {};
var buffer = '', hashTypes, hashContexts, escapeExpression=this.escapeExpression;
data.buffer.push("I'm a cow ");
hashTypes = {};
hashContexts = {};
data.buffer.push(escapeExpression(helpers.log.call(depth0, "", {hash:{},contexts:[depth0],types:["ID"],hashContexts:hashContexts,hashTypes:hashTypes,data:data})));
return buffer;
}
最小化为像这样丑陋的东西:
function anonymous(e,t,n,r,i){this.compilerInfo=[4,">= 1.0.0"];n=this.merge(n,Ember.Handlebars.helpers);i=i||{};var s="",o,u,a=this.escapeExpression;i.buffer.push("I'm a cow ");o={};u={};i.buffer.push(a(n.log.call(t,"",{hash:{},contexts:[t],types:["ID"],hashContexts:u,hashTypes:o,data:i})));return s}
根据您的后端是什么,您可以事先编译和捆绑您的模板并将它们发送到 html 中,这样您就可以避免花费时间编译模板客户端。