【问题标题】:EmberJs: render a template within a handlebars-helper into its parent elementEmberJs:将车把助手中的模板渲染到其父元素中
【发布时间】:2013-02-14 19:56:11
【问题描述】:

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

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

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 字符串并返回它?

【问题讨论】:

    标签: templates ember.js rendering handlebars.js


    【解决方案1】:

    我偶尔发现在父视图类中定义子视图类而不是全局视图类很有价值。您可以将任何路径(全局或本地)传递给 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 --")
      })
    });
    

    【讨论】:

      【解决方案2】:

      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 约定中。

      【讨论】:

      • 感谢您的回复。 here 是一个 jsfiddle,它以某种方式描述了我的情况。您将如何将您的解决方案应用于这种情况?
      猜你喜欢
      • 2013-01-25
      • 2019-02-03
      • 2012-07-21
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      相关资源
      最近更新 更多