我对Ember完全不熟悉,我实际上正在尝试组织我的代码。为此,我尝试从外部文件加载Handlebars模板。一切正常,直到我想要编译它们。
var url = 'js/app/templates/index.hbs', templateName = url.replace('.hbs', ''),
datas = {name:'John'};
var load_tpl_success = function(hbs_tpl) {
Em.TEMPLATES[templateName] = Em.Handlebars.compile(hbs_tpl)(datas);
Em.$('body').append(Em.TEMPLATES[templateName]);
};
Em.$.ajax({ url: url, async: false, success: load_tpl_success});
这会崩溃并给我错误:未捕获的TypeError:无法调用未定义的方法'push'
但是,如果我使用:
Handlebars.compile(hbs_tpl)(datas)
一切顺利,直到我开始使用{{input}}和其他由Ember制作的。所以基本上它看起来像Handlebars工作但不是Ember ......我需要Ember ahah
我正在使用最新版本的Ember带有自己的Handlebars(旧版本)。
有没有人有想法?
答案 0 :(得分:1)
Em.Handlebars.compile
返回可用于渲染的模板函数。您正在创建模板,然后立即调用该函数来编译模板。
Em.TEMPLATES[templateName] = Em.Handlebars.compile(hbs_tpl)(datas);
该行未创建模板,它创建一个然后呈现它。因此,虽然Ember.js期望一个模板,但你给它一个渲染模板(一个字符串)。你永远不应该直接调用模板方法,这是由Ember.js为你完成的。所以这一行是大禁忌。
Em.$('body').append(Em.TEMPLATES[templateName]);
你应该对模板做的唯一事情是创建它们并告诉Ember.js它们在哪里。您可以通过script
标记将它们包含在HTML中,或者将它们放在Em.TEMPLATES
哈希中来实现。但是,如果您正在执行后者,请确保在将该模板放入该模板之前不要尝试使用该模板。
TL; DR:你也太新了Ember.js担心预编译或延迟加载模板。将它们放在指南中的script
标签中,直到您更熟悉其工作方式。
编辑:此外,这通常适用,但尤其是在使用Ember.js时:从不运行同步AJAX请求。很少有人想要这样做,而这不是其中之一。