Ember.Handlebars.compile失败

时间:2014-04-06 09:38:20

标签: ember.js handlebars.js

我对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(旧版本)。

有没有人有想法?

1 个答案:

答案 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请求。很少有人想要这样做,而这不是其中之一。