Ember.js中的视图与组件

Bra*_*ger 143 javascript handlebars.js ember.js

我正在学习ember.js,我试图理解视图和组件之间的区别.我认为两者都是制作可重用组件的一种方式.

来自Ember的网站上的观点:

Ember.js中的视图通常仅出于以下原因创建:
- 当您需要复杂处理用户事件时
- 何时想要创建可重用组件

来自Ember的组件网站:

组件是一个自定义HTML标记,您使用JavaScript实现其行为,并使用Handlebars模板描述其外观.它们允许您创建可重用的控件,以简化应用程序的模板.

那么视图和组件之间的主要区别是什么?什么是一个常见的例子,我更喜欢在组件上使用视图,反之亦然?

int*_*xel 170

Ember.View

一个Ember.View目前仅限于由W3C的为您创建的标签.但是,如果您想定义自己的特定于应用程序的HTML标记,然后使用JavaScript实现其行为?你不能用Ember.View实际做到这一点.

Ember.Component

这正是组件让你做的事情.事实上,W3C目前正在研究自定义元素规范,这是一个好主意.

Ember的组件实现尽可能与Web组件规范密切相关.一旦自定义元素在浏览器中广泛使用,您就应该能够轻松地将Ember组件迁移到W3C标准,并使其可以被其他框架使用,这些框架也采用了新标准.

这对我们来说非常重要,我们正在与标准组织密切合作,以确保我们的组件实施符合Web平台的路线图.

另外需要注意的是,Ember.Component实际上是Ember.View(子类),但它是完全隔离的.其模板中的属性访问权限转到视图对象,操作也以视图对象为目标.没有访问周围context或外部controller 所有上下文信息的传入,这不是Ember.View的情况,它确实可以访问它的周围控制器,例如在视图中你可以做一些类似this.get('controller')会给你的东西控制器当前与视图相关联.

那么视图和组件之间的主要区别是什么?

因此,除了组件之外的主要区别是您可以创建自己的标签,并且在将来某些时候,当自定义元素可用时,也可以在其他支持自定义元素的框架中迁移/使用这些组件,确实在某些时候是ember组件根据具体的实施案例,将使视图有些过时.

什么是一个常见的例子,我更喜欢在组件上使用视图,反之亦然?

根据上述情况,这明显取决于您的使用案例.但根据经验,如果您需要在视图中访问它的周围控制器等,请使用Ember.View,但是如果您想隔离视图并仅传入它需要工作的信息,使其与上下文无关更可重用,使用Ember.Component.

希望能帮助到你.

更新

随着Road to Ember 2.0的发布,现在鼓励您在大多数情况下使用Components而不是Views.

  • @ sly7_7,是的,我明白你的观点.但是我会把一个组件想象成一个黑盒子,只根据它传入的数据行为.是的,取决于它的作用,这可能会很快变得混乱.一个专用的控制器将具有绝对意义,它可以工作的方式是如果组件可以成为逻辑注入其中,但据我所知,组件不是设计的ember容器的一部分,我猜,但它可能在未来改变为解决这样的事情.反正好点! (3认同)
  • 任何绑定都可以用于组件吗?IE,使用块组件的形式可以将块中的内容元素绑定到组件的属性,或者在这种情况下我必须使用视图吗? (2认同)
  • 啊,是的,他们可以.`{{view.xxxx}}`在组件中与视图中相同. (2认同)

Joh*_*ika 17

答案很简单:使用组件

根据2013年8月录制的培训视频,Yehuda Kats和Tom Dale(Ember核心团队成员)告诉观众不要使用视图,除非您是框架开发人员.他们对Handlebars进行了大量改进并引入了组件,因此不再需要视图.内部使用视图来支持{{#if}}和{{outlet}}等内容.

组件也非常类似于将构建到浏览器中的Web组件标准,因此为舒适地构建Ember组件提供了许多方面的好处.

更新2014-11-27

现在使用组件而不是视图更加重要,因为Ember 2.0将在输入路径时使用Routable Components,而不是控制器/视图.为了将来证明您的应用程序,最好远离视图.

资料来源:

  • "如果您觉得需要使用视图,请改用Component." 是一个糟糕的建议,并且背叛了对组件所涉及的隔离缺乏了解. (5认同)
  • 我找到了消息来源:Gaslight视频培训,视频10.3组件Q&A @ 26m标记.汤姆说:''因为这些例子是写的,所以我们添加了组件[这些例子写完时不存在].总的来说,我会说Views不是我们期望大多数开发人员写的东西,他们现在更像是一个内部的簿记对象' (2认同)
  • @jmcd,在那段视频@ 26:15中,汤姆说"基本上不使用视图".此外,如果你在同一个视频中跳到30米,Yehuda Katz说:"View基本上是一个内部实现细节...你可以使用View,但是你是一个框架开发人员.你应该使用其中一个东西我们为你构建的使用View,而最接近View但具有更好语义的是Component.你可以使用View for之前的任何东西,Component就可以了." (2认同)

Dan*_*mak 5

就目前而言- v2.x作为当前的稳定版本-视图已被完全弃用。据说从Ember 2.0 API中删除了视图

因此,{{view}}在Ember 2.0中使用关键字将触发一个断言:

断言失败:{{view}}在Ember 2.0中已删除了使用或基于它的任何路径

如果必须在Ember 2.0中使用视图,则可以使用ember-legacy-views插件,该插件在版本2.4之前与Ember兼容

因此,总而言之-组件是当前(删除视图)和将来-还将替换控制器。请参阅路由组件RFC