1

因为我在变量中有视图的名称,所以我使用把手助手来渲染它。

所以,我有一个对象如下(当然都是简化的)

config = Ember.Object.create({ view: "MyTplView"}) ;

接下来,我有以下模板

<script type="text/x-handlebars" data-template-name="index">
    <div id="container">
        {{helperViewRenderer config}}
    </div>
</script>

和 Handlebars 助手

Ember.Handlebars.registerBoundHelper('helperViewRenderer', function(value, options) {
    var template = App[value.view].create() ;
    template.appendTo("#container") ;
}) ;

问题是我尝试将模板插入到 id 为“container”的元素中,该元素当时不存在。解决此问题的可能性是什么。例如,是否可以从模板中获取 HTML 字符串并返回它?

4

2 回答 2

2

我偶尔发现在父视图类中定义子视图类而不是全局视图类很有价值。您可以将任何路径(全局或本地)传递给view帮助程序,并且当前视图view在当前上下文中可用。因此,

App.ParentView = Ember.View.extend({
  template: Ember.Handlebars.compile("The parent's child: {{view view.ChildView}}."),

  ChildView: Ember.View.extend({
    template: Ember.Handlebars.compile("-- child view --")
  })
});
于 2013-02-17T03:48:19.813 回答
1

Ember 试图通过使用新路由器来创建“出口”。

如果您想使用该appendTo方法,那么显然您必须将您的模板附加到现有的 HTML 元素中。这样,您无法从模板中获取 HTML 字符串(除非您知道它是父模板的一部分)。但是,如果您不太在意插入模板的位置,则可以使用直线append将模板添加到正文的末尾。

我认为在您的情况下,最好熟悉路由器,因为您似乎希望在同一个主模板中呈现不同的模板。因此,您可以通过将 URL 用作变量并将相关视图注入到插座中来轻松地将它们分开。

App.Router.map(function () {
  this.route("index", { path: "/" });
  this.route("first", { path: "/view1" });
  this.route("another", { path: "/view2" });
});

App.FirstRoute = Em.Route.extend({
  renderTemplate: function () {
    this.render('view1', { outlet: 'main' });
  }
});

App.AnotherRoute = Em.Route.extend({
  renderTemplate: function () {
    this.render('view2', { outlet: 'main' });
  }
});

看法:

<script type="text/x-handlebars" data-template-name="index">
    <div id="container">
        {{outlet main}}
    </div>
</script>

这样,您就不需要任何把手助手传递变量,并且所有这些都整齐地包含在 Ember 约定中。

于 2013-02-14T21:19:24.713 回答