我正在学习使用Ember和Grunt预编译的HBS模板,但是也希望在“开发者模式”下运行,其中App将在运行时编译HBS,如果它没有找到它们。
我已经阅读了几种方法来解决这个问题,并尝试使用'$ .ajax()'和'Ember.Handlebars.compile(data)'来执行此操作,其中返回的每个模板都添加到Ember中。 TEMPLATES数组。这对文件系统无效,所以我在localhost tomcat上测试它,其中Ember App被添加到webapps / ROOT。
我正在使用我在网上找到的演示'用户管理'应用程序,该应用程序使用了几个组件,帮助程序和“生成的控制器”。因此,模板编译正常,但Helper注册存在问题,例如:
Handlebars错误:无法在对象上找到属性'modal-box'(生成的模态演示控制器)。
...所以在将组件模板添加到Templates数组后,我尝试按名称注册它:
if (templateName == 'components/modal-box') {
Ember.Handlebars.helper('modal-box', function(value, options) {
var escaped = Handlebars.Utils.escapeExpression(value);
return new Handlebars.SafeString(tmpl);
});
}
...但后来我收到了这个新错误:
registerBoundHelper生成的助手不支持与Handlebars块一起使用。 “模板是使用旧版本的Handlebars预编译的,而不是当前运行时。”
这一切都在“App create ready”函数中完成,该函数迭代模板名称列表,我想进一步发展到它动态读取模板文件名称的位置。 Grunt进程还压缩CSS并连接脚本,所以我想为这些进行“开发者模式”处理。但是现在我专注于HBS模板&组件。
我认为这必须是一个FAQ,所以我想知道社区是否已经达到了这种运行时编译开发的最佳实践?
如果不能如何解决我的问题,让组件模板帮助生成的控制器正确注册?
答案 0 :(得分:1)
他们只需要在编译其他模板之前进行注册。
Em.TEMPLATES["components/cow-dude"] = Ember.Handlebars.compile("I'm a cow");
App = Ember.Application.create();
http://emberjs.jsbin.com/apIRef/28/edit
操作顺序很重要,如果它首先编译其他模板,他们只会假设cow-dude
是上下文中模型的属性(可能是未定义的)(http://emberjs.jsbin.com/apIRef/27/edit)。话虽这么说,如果你要延迟加载组件/助手,那些需要在它们的任何依赖之前加载(当你只是将它们全部输入时,Ember会为你处理这一切)。
另外,听起来你使用了两个不同版本的Handlebars,这就是为什么它会给你Template was precompiled with an older version of Handlebars than the current runtime.
我向其他可能对您有用的回复写了类似的回复:Ember.js with external handlebars template