作为尝试将相当大/复杂的现有应用程序移植到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 - 显示在命名模板内容发生变化后等待渲染视图之前会发生什么。
Second fiddle - 显示在命名模板内容更改后呈现视图之前没有延迟时会发生什么。
显然有一些我不理解的魔法。任何人都可以对此有所了解吗?
更新
我浏览了Ember.View和容器模块的源代码,并意识到我可以通过以跳过容器缓存查找的方式覆盖“模板”计算属性来解决第一小提琴中的问题。我已经提出另一个fiddle here来证明我找到的解决方案。
这似乎按照我希望的方式运行 - 但是 - 感觉就像我可能正在与框架作斗争,并且以一种可能会在以后咬我的方式从容器中“解开”。有没有更好的,更Ember式的方式来完成我想要做的事情?我发现黑客会破坏它吗?
更新2
我还发现也可以简单地调用
view2.get('container').reset();
在第一小提琴中附加view2之前。似乎更清洁/更安全,但它是“合法的”吗?我已更新First fiddle来说明这一点。
答案 0 :(得分:0)
(在第二个小提琴中,两个视图都显示第二个模板)
这是因为view1.appendTo($("#target"));
只是调度追加,实际的视图渲染直到运行循环结束才会发生。在此之前,您已设置Ember.TEMPLATES["myTemplate"] = template2;
(在第一个小提琴中,两个视图都显示第一个模板)
非常肯定这是因为ember容器缓存了模板fx,但不是100%。检查...
答案 1 :(得分:0)
我打电话给这个回答。正如我在第二条评论中提到的那样,我在我的项目中使用this fiddle中显示的解决方案,沿着这些方向:
mYiew.get('container').reset();
有一些关于容器不打算在这里用作API的讨论:https://github.com/emberjs/ember.js/commit/5becdc4467573f80a5c5dbb51d97c6b9239714a8,但似乎没有提到使用Views中的容器用于其他用例。
此外,可以直接访问View的容器(“.container”) - 这意味着开发人员没有“难以”达到他们对应用程序的“.__容器__”的方式。这可能暗示了他们打算如何使用它。
由于View能够在我认为不合理或不合理的情况下清除其缓存,我正在使用上述解决方案......至少在有人让我直截了当一个更好的主意(或缓存API)。