ember.js + handlebars:渲染vs出口vs部分vs视图与控制

时间:2013-11-14 15:54:45

标签: javascript ember.js handlebars.js

每个周围都有分散的解释,但我仍然没有100%清楚差异和差异。用法。有人可以给我一个并排比较吗?

{{outlet}}
{{outlet NAME}}
{{render}}
{{partial}}
{{view}}
{{control}}

注意:this post对部分vs渲染

非常有帮助

4 个答案:

答案 0 :(得分:84)

它们都是模板助手,具有以下主要特征,如emberjs指南中所述。 (http://emberjs.com/guides/templates/rendering-with-helpers/

1. {{outlet}} - 根据路由器确定的路由呈现模板。基于该路由,使用相应的控制器和视图。 这在基于路线呈现内容时很有用,这是最常见的情况

2. {{outlet NAME}} - 提供在路线中指定准确呈现内容的功能。 在尝试从路径的多个模板中呈现内容时很有用

3. {{render}} - 与outlet类似,但控制器/视图/模型可以直接或间接地从帮助程序指定。当需要从多个模板呈现内容并且能够覆盖上下文(视图/控制器)和模型时非常有用。如果指定了model,它将使用相应控制器的唯一实例,否则将使用单例实例。 在需要覆盖路线的上下文和模型时有用,同时渲染多个模板内容

4. {{control}} - 像渲染一样工作,除了它为每个调用使用一个新的控制器实例,而不是重用单例控制器。使用render时,如果不指定模型,则无法对同一路径使用多个渲染,因此应使用control用于为每个呈现的模板内容支持控制器的新实例。

更新:控件助手已被移除https://github.com/emberjs/ember.js/commit/86eecd7ef7cdc7d2ea6f77b3a726b293292ec55d

5. {{partial}} - 将模板渲染为参数,并将模板渲染到位。它不会改变背景或范围。它只是将给定的模板与当前范围放在一起。因此没有为partial指定视图类。 当需要将模板分解为模板模块,以便更好地控制或重用,而无需创建任何视图类时非常有用。

6. {{view}} - 这部分工作,但提供了一个视图类。 view类指定要使用的模板。 将模板分解为模块但需要视图类时非常有用用于事件处理。

7. {{#view}} - 还有视图助手的块形式,它允许指定与父视图模板内联的子视图的模板。 (http://emberjs.com/guides/views/inserting-views-in-templates/

答案 1 :(得分:9)

{{outlet}}这定义了嵌套资源/路由将在路径模板中呈现的位置

{{outlet NAME}}这会创建一个命名插座,您可以在其中以编程方式将某些内容呈现为

App.PostRoute = App.Route.extend({
  renderTemplate: function() {
    this.render('favoritePost', {   // the template to render
      into: 'posts',                // the route to render into
      outlet: 'posts',              // the name of the outlet in the route's template
      controller: 'blogPost'        // the controller to use for the template
    });
    this.render('comments', {
      into: 'favoritePost',
      outlet: 'comment',    
      controller: 'blogPost'
    });
  }
});

{{render}}有两个参数:

第一个参数描述了要设置的上下文 可选的第二个参数是一个模型,如果提供

,它将被传递给控制器

{{render}}做了几件事:

当没有提供模型时,它获取相应控制器的单例实例 提供模型时,它会获得相应控制器的唯一实例 使用此控制器呈现命名模板 设置相应控制器的模型

{{partial}}将模板呈现为参数,并将该模板放置到位(使用当前范围作为上下文)。

{{view}}此帮助程序的工作方式与部分帮助程序类似,除了提供要在当前模板中呈现的模板之外,您提供了一个视图类。视图控制渲染的模板。

{{control}} 已弃用的工作方式与渲染类似,不同之处在于它为每次调用使用新的控制器实例,而不是重复使用单例控制器。

我刚从他们的文档中复制并粘贴了大部分内容:http://emberjs.com/guides/templates/rendering-with-helpers/

答案 2 :(得分:2)

  1. render helper在v2.x中已弃用,您需要使用ember-elsewhere插件。 https://emberjs.com/deprecations/v2.x/#toc_rendering-into-a-render-helper-that-resolves-to-an-outlet
  2. ember.view在v1.x中已弃用,而是使用Component。参考https://emberjs.com/deprecations/v1.x/#toc_ember-view
  3. control助手只是实验性的,已经删除了
  4. 我想说目前只鼓励{{outlet}},其余的都被弃用/删除。

答案 3 :(得分:0)

主要区别是

{{view}}呈现应提供的提供的视图类

{{partial}}在Ember.TEMPLATES中呈现模板。它可能没有相关的视图类。优势是父视图的模板保留的上下文。

{{outlet}}指定应在此处呈现提供的视图或模板的路由器,或者根据renderTemplate()钩子指定路由器。

当您想要在不同位置呈现两个视图/模板时,

{{outlet NAME}}非常有用。您可以命名插座并要求路由器进行渲染。

{{render}}与outlet相同,除非您强制路由器呈现特定的视图/模板。