作为将相当大/复杂的现有应用程序移植到 Ember 世界的尝试的一部分,我正在使用以下技术动态生成和编译命名的 Handlebars 模板,并将视图与它们相关联:
var template = Ember.Handlebars.compile("some handlebars stuff");
Ember.TEMPLATES["myTemplate"] = template;
var view = Ember.View.create({
templateName: "myTemplate"
});
我想做的一件事是能够重新编译新的/不同的 Handlebars 模板标记,它会覆盖名为“myTemplate”的模板,并让该名称的视图可以访问它。
尝试这样做时,我得到了意想不到的结果-一些说明问题的小提琴:
First fiddle - 显示如果在命名模板内容更改后渲染视图之前等待会发生什么。
第二小提琴- 显示如果在命名模板内容更改后渲染视图之前没有延迟会发生什么。
引擎盖下显然有一些我不理解的魔法。任何人都可以对此有所了解吗?
更新:
我浏览了 Ember.View 和容器模块的源代码,并意识到我可以通过以跳过容器缓存查找的方式覆盖“模板”计算属性来解决第一小提琴中的问题。我在这里放了另一个小提琴来演示我找到的解决方案。
这似乎以我希望的方式工作 - 但是 - 感觉就像我可能正在与框架作斗争并以一种可能会在以后咬我的方式从容器中“脱钩”。有没有更好、更Ember-esque 的方式来完成我想要做的事情?我发现的黑客会破坏东西吗?
更新 2
我还发现也可以简单地调用
view2.get('container').reset();
在第一个小提琴中附加 view2 之前。看起来更干净/更安全,但它“合法”吗?我已经更新了第一小提琴来说明这一点。