一、概述

1. 为了定义一个组件,创建一个模板,它的名字以components/开头。为了定义一个新组件{{blog-post}},例如,创建一个components/blog-post模板。

2.注意:在组件的名字中至少要有一个破折号。所以blog-post是可以接受的名字,audio-player-controls也是,但是post不是。这样可以防止与当前或者未来的HTML元素名字冲突,并且确保Ember自动检测组件。

3. 一个组件的例子:

app/templates/components/blog-post.hbs

<h1>Blog Post</h1>
<p>Lorem ipsum dolor sit amet.</p>

4. 名字以components/开始的模板创建一个和它同名的组件。假设是上面的模板,你现在可以使用{{blog-post}}自定义元素:

app/templates/index.hbs

{{#each model as |post|}}
{{#blog-post title=post.title}}
{{post.body}}
{{/blog-post}}
{{/each}}

app/templates/components/blog-post.hbs

<article class="blog-post">
<h1>{{title}}</h1>
<p>{{yield}}</p>
<p>Edit title: {{input type="text" value=title}}</p>
</article>

app/routes/index.js

var posts = [{
title: "Rails is omakase",
body: "There are lots of à la carte software environments in this world."
}, {
title: "Broken Promises",
body: "James Coglan wrote a lengthy article about Promises in node.js."
}]; export default Ember.Route.extend({
model() {
return posts;
}
});

app/components/blog-post.js

export default Ember.Component.extend({
});

4. 每一个组件,背地里,是被一个元素支持的。默认的Ember将会使用<div>元素去包含你的组件模板。为了学习Ember使用你的模板如何改变元素,请看Customizing a Component's Element

二、Defining a component subclass

1. 多数情况下,你的组件将只是封装特定片段的Handlebars templates,你一遍又一遍的使用。在这种情况下,写任何JS代码。就像上面描述的定义Handlebars template并且使用被创建的组件。

2. 如果你需要自定义组件的行为,你需要定义一个Ember.Component的子类。例如,如果你想改变一个组件的元素你将需要一个自定义的子类,响应来自组件模板的actions,或者使用JS手动更改组件的元素。

3. Ember基于它的文件名知道那个子类驱动组件。例如,如果你有一个名为blog-post的组件,你将创建一个文件app/components/blog-post.js。如果你的组件名为audio-player-controls,文件名将会是app/components/audio-player-controls.js

三、Dynamically rendering a component

1. {{component}}辅助器可以被用来推迟一个组件的选择到运行时。{{my-component}}句法将总是加载相同的模板,而使用 {{component}}辅助器允许在动态加载时交换组件。在一些情况下这是有用的,你希望和基于数据的不同的外部库交互。使用{{component}}辅助器允许你保留这些不同的逻辑良好分离。

2. 辅助器的第一个参数是要渲染的组件名字,是一个字符串。所以如果你有{{component 'blog-post'}},这和{{blog-post}}是一样的。

3. {{component}}的真正值来自能够动态挑选被加载的组件。下面是一个使用辅助器的例子,为展现不同类型的posts派遣不同的组件:

app/templates/components/foo-component.hbs

<h3>Hello from foo!</h3>
<p>{{post.body}}</p>

app/templates/components/bar-component.hbs

<h3>Hello from bar!</h3>
<div>{{post.author}}</div>

app/routes/index.js

var posts = [{
componentName: 'foo-component', // key used to determine the rendered component
body: "There are lots of à la carte software environments in this world."
}, {
componentName: 'bar-component',
author: "Drew Crawford"
}]; export default Ember.Route.extend({
model() {
return posts;
}
});

app/templates/index.hbs

{{#each model as |post|}}
{{!-- either foo-component or bar-component --}}
{{component post.componentName post=post}}
{{/each}}

4. 为了简便起见,componentName被硬编码进每一个post中,它可以很好地作为一个计算属性,可以减少基于数据的目标组件。

5. 当传递给{{component}}的参数等价于null或者undefined时,辅助器什么都不会加载。当参数变化时,当前加载的组件会被销毁并且新的组件被创建并且引入。

6. 响应数据挑选不同的组件去加载可以让你为每一种情况有不同的模板和行为。该{{component}}助手是一个功能强大的工具,提高代码的模块化。

5.2 Components — Defining A Component的更多相关文章

  1. [Vue @Component] Dynamic Vue.js Components with the component element

    You can dynamically switch between components in a template by using the reserved <component>  ...

  2. [Vue] Dynamic Vue.js Components with the component element

    You can dynamically switch between components in a template by using the reserved <component>  ...

  3. angularjs component

    Component https://docs.angularjs.org/guide/component component本质上就是directive. This is a shorthand fo ...

  4. [zz] Principal Components Analysis (PCA) 主成分分析

    我理解PCA应该分为2个过程:1.求出降维矩阵:2.利用得到的降维矩阵,对数据/特征做降维. 这里分成了两篇博客,来做总结. http://matlabdatamining.blogspot.com/ ...

  5. Exploring the Angular 1.5 .component() method

    Angular 1.5 introduced the .component() helper method, which is much simpler than the.directive() de ...

  6. [React] Styling React Components With Aphrodite

    Aphrodite is a library styling React components. You get all the benefits of inline styles (encapsul ...

  7. [React] Higher Order Components (replaces Mixins)

    Higher order components will allow you to apply behaviors to multiple React components. So the idea ...

  8. [React Native] Using the Image component and reusable styles

    Let's take a look at the basics of using React Native's Image component, as well as adding some reus ...

  9. angular2 学习笔记 ( Component 组件)

    refer : https://angular.cn/docs/ts/latest/guide/template-syntax.html https://angular.cn/docs/ts/late ...

随机推荐

  1. swift开发之--报错:Class "***ViewController" has no initializers

    因为Swift中要求变量或常量在声明时就要初始化其值,所以我们在实际开发中,声明变量或常量时使用可选类型. ?!1234 var stitle : UILabel?var webview : UIWe ...

  2. ionic简单路由及页面传参

    1)页面跳转及传参方法 angular.module('app.routes', [])//routes路由模型 .config(function($stateProvider, $urlRouter ...

  3. Android package属性、package name和Application ID三者的联系及区别

    package属性:在AndroidManifest.xml文件中. package name:模块结构的包名. Application ID:模块defaultConfig块下的applicatio ...

  4. UITableView取消选中颜色、常用操作

    UITableView取消选中颜色.常用操作   使用空白view取代cell - (UITableViewCell *)tableView:(UITableView *)tableView cell ...

  5. Hacking up an armv7s library

    NOTE: Please take care with this. I obviously cannot test if this will actually work on a new iPhone ...

  6. scss的安装使用

    Ruby的安装 如果是Window系统,请打开:http://rubyinstaller.org/downloads/ ,下载当前稳定版本的exe文件.界面如下所示: Step(2): 接下来,在系统 ...

  7. iOS 8 新特性介绍

    来源:nshipster.cn 发布时间:2014-07-06 阅读次数:2152 随便去问任何人,他们都会告诉你WWDC2014是近年来最为激动的回忆. 整个大会没有发布任何新硬件,它是一次史无前例 ...

  8. 在linux下安装Avria(小红伞)

    1.下载AntiVir PersonalEdition Classic for linux http://www.free-av.com/ 2.解压: tar zxvf antivir.tar.gz ...

  9. java后端技术栈

  10. Linux操作系统上ADSL拨号上网的方法详解

    1.安装 yum install rp-pppoe.x86_64 2.配置PPPOE客户端软件 安装完软件包后,必须配置pppoe的配置文件/etc/ppp/pppoe.conf,从而让ADSL拨号时 ...