首页 web前端 js教程 了解Ember 2中的组件

了解Ember 2中的组件

Feb 18, 2025 am 10:43 AM

Understanding Components in Ember 2

关键要点

  • Ember组件是Ember应用的核心,允许开发者定义自定义的、特定于应用的HTML标签,并使用JavaScript实现其行为。在Ember 2.x中,组件取代了视图和控制器。
  • Ember组件包含一个Handlebars模板文件和一个配套的Ember类。这些组件可以与其他组件一起使用,甚至可以嵌套在父组件中,并具有类似于原生HTML元素的属性。
  • 可以通过模型(表示应用程序向用户呈现的基础数据的对象)向Ember应用程序添加动态数据。这允许创建交互式和动态组件。
  • 可以使用操作(发送到组件类的动作)向组件添加用户交互。这些操作可用于创建交互式元素,例如显示不同内容的可点击选项卡。

本文由Edwin Reynoso和Nilson Jacques同行评审。感谢所有SitePoint的同行评审者,使SitePoint的内容达到最佳状态! 组件是Ember应用程序的重要组成部分。它们允许您定义自己的、特定于应用程序的HTML标签,并使用JavaScript实现其行为。从Ember 2.x开始,组件将取代视图和控制器(已被弃用),并且是构建Ember应用程序的推荐方法。

Ember对组件的实现尽可能地遵循W3C的Web组件规范。一旦自定义元素在浏览器中广泛可用,应该很容易将Ember组件迁移到W3C标准,并使其可被其他框架使用。

如果您想了解更多关于可路由组件为什么取代控制器和视图的信息,请查看Ember核心团队成员Yehuda Katz和Tom Dale的这段简短视频。

选项卡切换器应用程序

为了深入了解Ember组件,我们将构建一个选项卡切换器小部件。这将包含一组带有相关内容的选项卡。点击一个选项卡将显示该选项卡的内容并隐藏其他选项卡的内容。够简单吧?让我们开始吧。

与以往一样,您可以在我们的GitHub仓库或这个Ember Twiddle上找到本教程的代码,如果您想在浏览器中试验代码的话。

Ember组件的构成

Ember组件包含一个Handlebars模板文件和一个配套的Ember类。只有当我们需要与组件进行额外的交互时,才需要实现此类。组件的使用方式类似于普通的HTML标签。当我们构建选项卡切换器组件时,我们将能够像这样使用它:

<code>{{tab-switcher}}{{/tab-switcher}}</code>
登录后复制
登录后复制
登录后复制

Ember组件的模板文件位于app/templates/components目录中。类文件位于app/components中。我们使用所有小写字母,单词之间用连字符分隔来命名Ember组件。这是按照约定来命名的,这样可以避免与未来的HTML Web组件发生名称冲突。

我们的主要Ember组件将是tab-switcher。请注意,我说的是主组件,因为我们将有多个组件。您可以将组件与其他组件结合使用。您甚至可以将组件嵌套在另一个父组件中。在我们的tab-switcher的情况下,我们将有一个或多个tab-item组件,如下所示:

<code>{{tab-switcher}}{{/tab-switcher}}</code>
登录后复制
登录后复制
登录后复制

如您所见,组件也可以像原生HTML元素一样具有属性。

创建Ember 2.x项目

要遵循本教程,您需要创建一个Ember 2.x项目。方法如下:

Ember使用npm安装。有关npm的教程,请参见此处。

<code>{{#each tabItems as |tabItem| }}
  {{tab-item item=tabItem 
             setSelectedTabItemAction="setSelectedTabItem" }}
{{/each}}</code>
登录后复制
登录后复制

在撰写本文时,这将引入版本1.13

<code>npm install -g ember-cli
</code>
登录后复制
登录后复制

接下来,创建一个新的Ember应用程序:

<code>ember -v
=> version: 1.13.8
</code>
登录后复制
登录后复制

导航到该目录并编辑bower.json文件以包含最新版本的Ember、ember-data和ember-load-initializers:

<code>ember new tabswitcher</code>
登录后复制

回到终端运行:

<code>{
  "name": "hello-world",
  "dependencies": {
    "ember": "^2.1.0",
    "ember-data": "^2.1.0",
    "ember-load-initializers": "^ember-cli/ember-load-initializers#0.1.7",
    ...
  }
}
</code>
登录后复制

Bower可能会提示您进行Ember的版本解析。从提供的列表中选择2.1版本,并在其前面加上感叹号以将其解析持久化到bower.json。

接下来启动Ember CLI的开发服务器:

<code>bower install
</code>
登录后复制

最后导航到http://localhost:4200/并检查浏览器控制台的版本。

创建选项卡切换器组件

让我们使用Ember内置的生成器创建一个选项卡切换器组件:

<code>ember server</code>
登录后复制

这将创建三个新文件。一个是我们的HTML的Handlebars文件(app/templates/components/tab-switcher.hbs),第二个是我们的组件类的JavaScript文件(app/components/tab-switcher.js),最后一个是测试文件(tests/integration/components/tab-switcher-test.js)。测试组件不在本教程的范围内,但您可以在Ember网站上阅读更多相关信息。

现在运行ember server来加载服务器并导航到http://localhost:4200/。您应该会看到一个标题为“欢迎来到Ember”的欢迎消息。那么为什么我们的组件没有显示出来呢?好吧,我们还没有使用它,所以让我们现在就使用它。

使用组件

打开应用程序模板app/templates/application.hbs。在h2标签后添加以下内容以使用组件。

<code>ember generate component tab-switcher</code>
登录后复制

在Ember中,组件可以通过两种方式使用。第一种方式,称为内联形式,是在不包含任何内容的情况下使用它们。这就是我们在这里所做的。第二种方式称为块形式,允许将Handlebars模板传递给组件,并在组件模板中{{yield}}表达式出现的地方呈现该模板。在本教程中,我们将坚持使用内联形式。

但是,这仍然没有在屏幕上显示任何内容。这是因为组件本身没有任何内容要显示。我们可以通过向组件的模板文件(app/templates/components/tab-switcher.hbs)添加以下行来更改这一点:

<code>{{tab-switcher}}{{/tab-switcher}}</code>
登录后复制
登录后复制
登录后复制

现在,当页面重新加载(应该会自动发生)时,您将看到上面显示的文本。令人兴奋的时刻!

创建选项卡项目组件

既然我们已经设置了我们的主要tab-switcher组件,让我们创建一些tab-item组件来嵌套在其中。我们可以像这样创建一个新的tab-item组件:

<code>{{#each tabItems as |tabItem| }}
  {{tab-item item=tabItem 
             setSelectedTabItemAction="setSelectedTabItem" }}
{{/each}}</code>
登录后复制
登录后复制

现在将新组件的Handlebars文件(app/templates/components/tab-item.hbs)更改为:

<code>npm install -g ember-cli
</code>
登录后复制
登录后复制

接下来,让我们将三个tab-items嵌套在我们的主要tab-switcher组件中。将tab-switcher模板文件(app/templates/components/tab-switcher.hbs)更改为:

<code>ember -v
=> version: 1.13.8
</code>
登录后复制
登录后复制

如上所述,yield辅助函数将呈现传递到我们组件中的任何Handlebars模板。但是,这只有在我们以块形式使用tab-switcher时才有用。由于我们没有这样做,我们可以完全删除yield辅助函数。

现在,当我们查看浏览器时,我们将看到三个tab-item组件,所有组件都显示“Tab Items Title”。我们的组件现在相当静态,所以让我们添加一些动态数据。

(剩余部分与上一个输出类似,只是对段落进行了重新组织和措辞的修改,以保持内容一致性并避免重复。 为了节省空间,这里不再重复剩余部分的输出。)

以上是了解Ember 2中的组件的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

console.log输出结果差异:两次调用为何不同? console.log输出结果差异:两次调用为何不同? Apr 04, 2025 pm 05:12 PM

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

See all articles