Ember.js 入门指南——自定义包裹组件的HTML标签

按照惯例,先做好准备工作,使用Ember CLI命令生成演示所需的文件:

ember g route customizing-component-element

ember g component customizing-component-element

ember g route home

ember g route about

默认情况下,组件会被包裹在div标签内。比如,组件渲染之后得到下面的代码:

<div id="ember180">
  <h1>My Component</h1>
</div>

h1标签就是组件的内容。以“ember”开头的id和class都是Ember自动生成的。如果你需要修改渲染之后生成的HTML不是被包裹在div标签,或者修改id和class等属性值为自定义的值,你可以在组件类中设置。

1,自定义包裹组件的HTML标签

默认情况下,组件会被包裹在div标签内,如果你需要修改这个默认值你可以在组件类中指定这个包裹的HTML标签。

//  app/components/customizing-component-element.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       // 使用tabName属性指定渲染之后HTML标签
       // 注意属性的值必须是标准的HTML标签名
       tagName: ‘nav‘
});

下面自定义一个组件。

<!--  app/templates/components/customizing-component-element.hbs  -->
 
<ul>
       <li>{{#link-to ‘home‘}}Home{{/link-to}}</li>
       <li>{{#link-to ‘about‘}}About{{/link-to}}</li>
</ul>

下面是调用组件的模板代码。注意组件被包裹在那个HTML标签内,正确情况下应该是被包裹在nav标签中。

<!--  app/templates/customizing-component-element.hbs  -->
 
{{customizing-component-element}}

页面加载之后查看页面的源代码。如下:

可以看到组件customizing-component-element的内容确实是被包裹在nav标签之中,如果在组件类中没有使用属性tagName指定包裹的HTML标签,默认是div,你可以把组件类中tagName属性删除之后再查看页面的HTML源码代码。

2,自定义包裹组件的HTML元素的类名

默认情况下,Ember会自动为包裹组件的HTML元素增加一个以“ember”开头的类名,如果你需要增加自定义的CSS类,可以在组件类中使用className数组属性指定,可以一次性指定多个CSS类。比如下面的代码例子:

//  app/components/customizing-component-element.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       // 使用tabName属性指定渲染之后HTML标签
       // 注意属性的值必须是标准的HTML标签名
       tagName: ‘nav‘,
       classNames: [‘primary‘, ‘my-class-name‘]  //指定包裹元素的CSS类
});

页面重新加载之后查看源代码,可以看到nav标签中多了两个CSS类,一个是primary,一个是my-class-name。

<nav id="ember411" class="ember-view primary my-class-name">
……
</nav>

如果你想根据某个数据的值决定是否增加CSS类也是可以做到的,比如下面的代码,当urgent为true的时增加一个CSS类urgent,否则不增加这个类。要达到这个目的可以通过属性classNameBindings设置。

//  app/components/customizing-component-element.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       // 使用tabName属性指定渲染之后HTML标签
       // 注意属性的值必须是标准的HTML标签名
       tagName: ‘nav‘,
       classNames: [‘primary‘, ‘my-class-name‘],  //指定包裹元素的CSS类
       classNameBindings: [‘urgent‘],
       urgent: true
});

页面重新加载之后查看源代码,可以看到nav标签中多了一个CSS类urgent,如果属性urgent的值为false,CSS类urgent将不会渲染到nav标签上。

<nav id="ember411" class="ember-view primary my-class-name urgent">
……
</nav>

注意:classNameBindings指定的属性值必须要跟用于判断数据的属性名一致,比如这个例子中classNameBindings指定的属性值是urgent,用户判断是否增加类的属性也是urgent。如果这个属性只是驼峰式命名的那么渲染之后CSS类名将是以中划线“-”分隔,比如classNameBindings指定一个名为secondClassName,渲染后的CSS类为second-class-name。比如下面的演示代码:

//  app/components/customizing-component-element.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       // 使用tabName属性指定渲染之后HTML标签
       // 注意属性的值必须是标准的HTML标签名
       tagName: ‘nav‘,
       classNames: [‘primary‘, ‘my-class-name‘],  //指定包裹元素的CSS类
       classNameBindings: [‘urgent‘, ‘secondClassName‘],
       urgent: true,
       secondClassName: true
});

页面重新加载之后查看源代码,可以看到nav标签中多了一个CSS类second-class-name。

<nav id="ember411" class="ember-view primary my-class-name urgent second-class-name">
……
</nav>

如果你不想渲染之后的CSS类名被修改为中划线分隔形式,你可以值classNameBindings属性中指定渲染之后的CSS类名。比如下面的代码:

//  app/components/customizing-component-element.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       // 使用tabName属性指定渲染之后HTML标签
       // 注意属性的值必须是标准的HTML标签名
       tagName: ‘nav‘,
       classNames: [‘primary‘, ‘my-class-name‘],  //指定包裹元素的CSS类
       classNameBindings: [‘urgent‘, ‘secondClassName:scn‘],  //指定secondClassName渲染之后的CSS类名为scn
       urgent: true,
       secondClassName: true
});

页面重新加载之后查看源代码,可以看到nav标签中原来CSS类为second-class-name的变成了scn。

<nav id="ember411" class="ember-view primary my-class-name urgent scn">
……
</nav>

有没有感觉Ember既灵活又强大!!Ember的设计理念是“约定优于配置”!所以很多的属性默认的设置都是我们平常开发中最常用的格式。

除了上述可以指定CSS类名之外,还可以在classNameBindings增加简单的逻辑。

//  app/components/customizing-component-element.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       // 使用tabName属性指定渲染之后HTML标签
       // 注意属性的值必须是标准的HTML标签名
       tagName: ‘nav‘,
       classNames: [‘primary‘, ‘my-class-name‘],  //指定包裹元素的CSS类
       classNameBindings: [‘urgent‘, ‘secondClassName:scn‘, ‘isEnabled:enabled:disabled‘],
       urgent: true,
       secondClassName: true,
       isEnabled: true  //如果这个属性为true,类enabled将被渲染到nav标签上,如果属性值为false类disabled将被渲染到nav标签上,类似于三目运算
});

正如代码的注释所说的,“isEnabled:enabled:disabled”可以理解为一个三目运算,会根据isEnabled的值渲染不同的CSS类到nav上。

下面的HTML代码是isEnabled为true的情况,对于isEnabled为false的情况请读者自己试试:

<nav id="ember411" class="ember-view primary my-class-name urgent scn enabled">
……
</nav>

注意:如果用于判断的属性值不是一个Boolean值而是一个字符串那么得到的结果与上面的结果是不一样的,Ember会直接把这个字符串的值作为CSS类名渲染到包裹的标签上。比如下面的代码:

//  app/components/customizing-component-element.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       // 使用tabName属性指定渲染之后HTML标签
       // 注意属性的值必须是标准的HTML标签名
       tagName: ‘nav‘,
       classNames: [‘primary‘, ‘my-class-name‘],  //指定包裹元素的CSS类
       classNameBindings: [‘urgent‘, ‘secondClassName:scn‘, ‘isEnabled:enabled:disabled‘, ‘stringValue‘],
       urgent: true,
       secondClassName: true,
       isEnabled: true,  //如果这个属性为true,类enabled将被渲染到nav标签上,如果属性值为false类disabled将被渲染到nav标签上,类似于三目运算
       stringValue: ‘renderedClassName‘
});

       此时页面的HTML源码就有点不一样了。‘renderedClassName‘作为CSS类名被渲染到了nav标签上。

<nav id="ember411" class="ember-view primary my-class-name urgent scn enabled renderedClassName">
……
</nav>

 

对于这点需要特别注意。Ember对于Boolean值和其他值的判断结果是不一样的。

3,自定义包裹组件的HTML元素的属性

在前面两点介绍了包裹组件的HTML元素的标签名、CSS类名,在HTML标签上出来CSS类另外一个最常用的就是属性,那么Ember同样提供了自定义包裹HTML元素的属性的方法。使用attributeBindings属性指定,这个属性的属性方式与classNameBindings基本一致。

为了与前面的例子区别开新建一个组件link-items,使用命令ember g component link-items创建。

<!--  app/templates/components/link-items.hbs  -->
 
这是个组件

在模板中调用组件。

<!--  app/templates/customizing-component-element.hbs  -->
 
{{customizing-component-element}}
<br><br>
 
{{link-items}}

下面设置组件类,指定包裹的HTML标签为a标签,并增加一个属性href。

//  app/components/link-items.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       tagName: ‘a‘,
       attributeBindings: [‘href‘],
       href: ‘http://www.google.com.hk‘
});

页面重新加载之后得到如下结果:

比较简单,对于渲染之后的结果我就不过多解释了,请参考classNameBindings属性理解。

到此,有关于组件渲染之后包裹组件的HTML标签的相关设置介绍完毕。内容不多,classNameBindings和attributeBindings这两个属性的使用方式基本相同。

如有疑问欢迎给我留言或者直接查看官方教程

时间: 2024-10-08 11:51:12

Ember.js 入门指南——自定义包裹组件的HTML标签的相关文章

Ember.js 入门指南——自定义序列号器

在Ember应用中,序列化器会格式化与后台交互的数据,包括发送和接收的数据.默认情况下会使用JSON API序列化数据.如果你的后端使用不同的格式,Ember Data允许你自定义序列化器或者定义一个完全不同的序列化器. Ember Data内置了三个序列化器.JSONAPISerializer是默认的序列化器,用与处理后端的JSON API.JSONSerializer是一个简单的序列化器,用与处理单个JSON对象或者是处理记录数组.RESTSerializer是一个复杂的序列化器,支持侧面加

Ember.js 入门指南——自定义适配器

在Ember应用中适配器决定了数据保存到后台的方式,比如URL格式和请求头部.Ember Data默认的适配器是内置的REST API回调. 实际使用中经常会扩展默认的适配器.Ember的立场是应该通过扩展适配器来添加不同的功能,而非添加标识.这样可以使得代码更加容易测试.更加容易理解,同时也降低了可能需要扩展的适配器的代码. 如果你的后端使用的是Ember约定的规则那么可用使用适配器adapters/application.js.适配器application优先级比默认的适配器高,但是比指定的

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

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

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 入门指南——异步路由

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

Ember.js 入门指南--目录

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

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

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

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

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

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

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