Ember.js 入门指南——组件定义

不得不说,Ember的更新是在是太快了!!本教程还没写到一半就又更新到v2.1.0了!!!!不过为了统一还是使用官方v2.0.0的参考文档!!

从本篇开始进入新的一章——组件。这一章将用6篇文章介绍Ember的组件,从它的定义开始知道它的使用方式,我将为你一一解答!

准备工作:

本章代码统一访问项目chapter4_components下,项目代码可以在以下网址上找到:

https://github.com/ubuntuvim/my_emberjs_code

https://git.oschina.net/chendequan/my_emberjs_code_2

与之前的文章一样,项目仍然是使用Ember CLI命令创建项目和各个组件文件。

创建项目并测试运行,首先执行如下四条命令,最后在浏览器执行:http://localhost:4200/

ember new chapter4_components

cd chapter4_components

ember server

如果你能在页面上看到“Welcome to Ember”说明项目框架搭建成功!那么你可以继续往下看了,否则想搭建好项目再往下学习~~~

1,自定义组件及使用

创建组件方法很简单:ember generate component my-component-name。一条命令即可,但是需要注意的是组件的名称必须要包含中划线“-”,比如blog-post、test-component、audio-player-controls这种格式的命名是合法,但是post、test这种方式的命名是不合法的!其一是为了防止用户自定义的组件名与W3C规定的元素标签名重复;其二是为了确保Ember能自动检测到用户自定义的组件。

下面定义一个组件,ember g component blog-post。Ember CLI会自动为你创建组件对应的的模板,执行这条命令之后你可以在app/components和app/templates/components下看到创建的文件。

<!--  app/templates/components/blog-post.hbs  -->
 
<article>
       <h1>{{title}}</h1>
       <p>{{yield}}</p>
       <p>Edit title: {{input type="text" value=title}}</p>
</article>

为了演示组件的使用需要做些准备工作:

ember g route index

//  app/routes/index.js
 
import Ember from ‘ember‘;
 
export default Ember.Route.extend({
      
       model: function() {
               return [
                 { id: 1, title: ‘Bower: dependencies and resolutions new‘, body: "In the bower.json file, I see 2 keys dependencies and resolutionsWhy is that so? I understand Bower has a flat dependency structure. So has it got anything to do with that ?", category: ‘java‘ },
                 { id: 2, title: ‘Highly Nested JSON Payload - hasMany error‘, body: "Welcome to the Ember.js discussion forum. We‘re running on the open source, Ember.js-powered Discourse forum software. They are also providing the hosting for us. Thanks guys! Please use this space for discussion abo… read more", category: ‘php‘ },
                 { id: 3, title: ‘Passing a jwt to my REST adapter new ‘, body: "This sets up a binding between the category query param in the URL, and the category property on controller:articles. In other words, once the articles route has been entered, any changes to the category query param in the URL will update the category property on controller:articles, and vice versa.", category: ‘java‘}
           ];
         
       }
});
<!-- app/templates/index.hbs  -->
 
{{#each model as |item|}}
       <!-- 使用自定义的组件blog-post -->
       {{#blog-post title=item.title}}
              {{item.body}}
       {{/blog-post}}
{{/each}}

在这段代码中,使用了自定义的组件来显示数据。最后页面显示如下:

看看生成的HTML代码:

自定义的组件被渲染到了模板index.hbs使用blog-post的地方。并且自定义组件的HTML标签没有变化。

到这里大概应该知道怎么去使用组件了,至于它是怎么就渲染到了使用组件的地方,以及它是怎么渲染上去的。别急~~后面的文章会为你一一解答。

说明:默认情况下,自定义的组件会被渲染到div标签内,当然这种默认情况也是可以修改的,比较简单在此不过多介绍,请自行学习,网址:http://guides.emberjs.com/v2.0.0/components/customizing-a-components-element/

2,自定义组件类

用户自定义的组件类都需要继承Ember.Component类。

通常情况下我们会把经常使用的模板片段封装成组件,只需要定义一次就可以在项目任何一个模板中使用,而且不需要编写任何的javascript代码。比如上述第一点“自定义组件及使用”中描述的一样。

但是如果你想你的组件有特殊的行为,并且这些行为是默认组件类无法提供的(比如:改变包裹组件的标签、响应组件模板初始化某个状态等),那么此时你可以自定义组件类,但是要继承Ember.Component,如果你自定义的组件类没有继承这个类,你自定义的组件就很有可能会出现一些不可预知的问题。

Ember所能识别的自定义组件类的名称是有规范的。比如,你定义了一个名为blog-post的组件,那么你的组件类的名称应该是app/components/blog-post.js。如果组件名为audio-player-controls那么对应的组件类名为app/components/audio-player-controls.js。即:组件类名与组件同名,这个是v2.0的命名方法,请区别就版本的Ember,旧版本的组件命名规则是驼峰式的命名规则。

举个简单的例子,在第一点“自定义组件及使用”中讲过,组件默认会被渲染到div标签内,你可以在组件类中修改这个默认标签。

//  app/components/blog-post.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       tagName: ‘nav‘
});

这段代码修改了包裹组件的标签名,页面刷新后HTML代码如下:

可以看到组件的HTML代码被包含在nav标签内。

3,动态渲染组件

组件的动态渲染与Java的多态有点相似。{{component}}助手会延迟到运行时才决定使用那个组件渲染页面。当程序需要根据数据不同渲染不同组件的时,这种动态渲染就显得特别有用。可以使你的逻辑和试图分离开。

那么要怎么使用呢?非常简单,只需要把组件名作为参数传递过去即可,比如:使用{{component ‘blog-post’}}与{{blog-post}}结果是一致的。我们可以修改第一点“自定义组件及使用”实例中模板index.hbs的代码。

<!-- app/templates/index.hbs  -->
 
{{#each model as |item|}}
       <!-- 使用自定义组件的另一种方式(动态渲染组件方式) -->
       {{component ‘blog-post‘ title=item.title}}
       {{item.body}}
{{/each}}

页面刷新之后,可以看到结果是一样的。

下面为读者演示如何根据数据不同渲染不同的组件。

按照惯例,先做好准备工作,使用Ember CLI命令创建2个不同的组件。

ember g component foo-component

ember g component bar-component

<!-- app/templates/components/bar-component.hbs -->
 
<h1>Hello from bar</h1>
<p>{{post.body}}</p>

为何能用post获取数据,因为在使用组件的地方传递了参数。在模板index.hbs中可以看到。

<!-- app/templates/components/foo-component.hbs -->
 
<h1>Hello from foo</h1>
<p>{{post.body}}</p>

修改显示的数据,注意数据的最后增加一个属性pn,pn的值就是组件的名称。

//  app/routes/index.js
 
import Ember from ‘ember‘;
 
export default Ember.Route.extend({
 
       model: function() {
               return [
                 { id: 1, title: ‘Bower: dependencies and resolutions new‘, body: "In the bower.json file, I see 2 keys dependencies and resolutionsWhy is that so? I understand Bower has a flat dependency structure. So has it got anything to do with that ?", pn: ‘bar-component‘ },
                 { id: 2, title: ‘Highly Nested JSON Payload - hasMany error‘, body: "Welcome to the Ember.js discussion forum. We‘re running on the open source, Ember.js-powered Discourse forum software. They are also providing the hosting for us. Thanks guys! Please use this space for discussion abo… read more", pn: ‘foo-component‘ },
                 { id: 3, title: ‘Passing a jwt to my REST adapter new ‘, body: "This sets up a binding between the category query param in the URL, and the category property on controller:articles. In other words, once the articles route has been entered, any changes to the category query param in the URL will update the category property on controller:articles, and vice versa.", pn: ‘bar-component‘}
           ];
         
       }
});

修改调用组件的模板index.hbs。

<!-- app/templates/index.hbs  -->
 
{{#each model as |item|}}
       <!-- 根据组件名渲染不同的组件,第一个参数是组件名,第二个参数为传递到组件上显示的数据 -->
       {{component item.pn post=item}}
{{/each}}

模板编译之后会得到形如{{component foo-component post}}的组件调用代码。

相信你应该了解了动态渲染组件是怎么回事了!自己动手试试吧~~

到此组件的定义与使用介绍完毕了,不知道你有没有学会呢?如果你有疑问请给我留言或者直接看官方教程学习。

文章原网址:http://ibeginner.sinaapp.com/index.php?m=Home&c=Index&a=detail&id=4fd3ad852fa5d701c2b281bdfbe6bfd1

时间: 10-06

Ember.js 入门指南——组件定义的相关文章

Ember.js 入门指南——路由定义

当你的应用启动的时候,路由器就会匹配当前的URL到你定义的路由上.然后按照定义的路由层次逐个加载数据.设置应用程序状态.渲染路由对应的模板. 1,基本路由 在app/router.js的map方法里定义的路由会映射到当前的URL.当map方法被调用的时候方法体内的route方法就会创建路由. 下面使用Ember CLI命令创建两个路由: ember generate route about ember generate route favorites 命令执行完之后你可在你的项目目录app/ro

Ember.js 入门指南——属性传递

1,传递参数到组件上 每个组件都是相对独立的,因此任何组件所需的数据都需要通过组件的属性把数据传递到组件中. 比如上篇<Ember.js 入门指南--组件定义>的第三点"{{component item.pn post=item}}"就是通过属性post把数据传递到组件foo-component或者bar-component上.如果在index.hbs中是如下方式调用组件那么渲染之后的页面是空的. {{component item.pn}} 请读者自己修改index.hbs

Ember.js 入门指南——总目录

Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,本系列教程是通过学习官网教程然后摘抄个人觉得比较重要的部分,加上学习实例整合而成,如有疏漏欢迎提出修改意见,一起成长! Ember官网:http://emberjs.com/ 教程官网:http://guides.emberjs.com/v2.0.0/ 在此简单介绍下 Ember: Ember是一个雄心勃勃的Web应用程序,消除了样板,并提供了一个标准的应用程序架构的JavaSc

Ember.js 入门指南——控制器(controller)

ember new chapter5_controllers cd chapter5_controllers ember server 从本篇开始进入第五章控制器,controller在Ember2.0开始越来越精简了,职责也更加单一--处理逻辑. 下面是准备工作. 从新创建一个Ember项目,仍旧使用的是Ember CLI命令创建. 在浏览器执行项目,看到如下信息说明项目搭建成功. Welcome to Ember 1,控制器简介 控制器与组件非常相似,由此,在未来的新版本中很有可能组件将会完

Ember.js 入门指南——包裹内容

准备工作: ember g route wrapping-content-in-component-route        ember g component wrapping-content-in-component 有些情况下,你需要定义一个包裹其他模板提供的数据的组件.比如下面的例子: <!--  app/templates/components/wrapping-content-in-component.hbs  -->   <h1>{{title}}</h1>

Ember.js 入门指南--目录

本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站. Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,本系列教程是通过学习官网教程然后摘抄个人觉得比较重要的部分,加上学习实例整合而成,如有疏漏欢迎提出修改意见,一起成长! Ember官网:http://emberjs.com/ 教程官网:http://guides.emberjs.com/v2.0.0/ 在此简单介绍下 Emb

Ember.js 入门指南——异步路由

本文将为你介绍路由的高级特性,这些高级特性可以用于处理项目复杂的异步逻辑. 关于单词promises,直译是承诺,但是个人觉得还是使用原文吧.读起来顺畅点. 1,promises(承诺) Ember的路由处理异步逻辑的方式是使用promises.简而言之,promises就是一个表示最终结果的对象.这个对象可能是fulfill(成功获取最终结果)也可能是reject(获取结果失败).为了获取这个最终值,或者是处理promises失败的情况都可以使用then方法,这个方法接受两个可选的回调方法,一

Ember.js 入门指南——model简介2

本文接上一篇<Ember.js 入门指南--model简介1>. 2,核心概念 声明:下面简介内摘抄至http://www.emberjs.cn/guides/models/#toc_. 1,store store是应用存放记录的中心仓库.你可以认为store是应用的所有数据的缓存.应用的控制器和路由都可以访问这个共享的store:当它们需要显示或者修改一个记录时,首先就需要访问store. DS.Store的实例会被自动创建,并且该实例被应用中所有的对象所共享. store可以看做是一个缓存

Ember.js 入门指南——路由简介

从本文开始,将为大家介绍路由(route),如果你看过前面的<Ember.js 入门指南--{{link-to}} 助手>这篇文章应该初步了解了route.不过在这篇文章中只是简单介绍了路由是定义.路由层次,更深入的route将从本文开始逐一介绍. 当用户使用你的应用时,应用要在不同的状态之间切换.Ember提供了很多工具用于管理那些因应用规模改变而改变的状态. 讲route前先了解URL,在应用中大概会会有如下方式设置URL: 用户第一次加载应用的时: 用户手动改变URL,比如点击按钮之后跳