5.2 Components — Defining A Component
一、概述
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的更多相关文章
- [Vue @Component] Dynamic Vue.js Components with the component element
You can dynamically switch between components in a template by using the reserved <component> ...
- [Vue] Dynamic Vue.js Components with the component element
You can dynamically switch between components in a template by using the reserved <component> ...
- angularjs component
Component https://docs.angularjs.org/guide/component component本质上就是directive. This is a shorthand fo ...
- [zz] Principal Components Analysis (PCA) 主成分分析
我理解PCA应该分为2个过程:1.求出降维矩阵:2.利用得到的降维矩阵,对数据/特征做降维. 这里分成了两篇博客,来做总结. http://matlabdatamining.blogspot.com/ ...
- Exploring the Angular 1.5 .component() method
Angular 1.5 introduced the .component() helper method, which is much simpler than the.directive() de ...
- [React] Styling React Components With Aphrodite
Aphrodite is a library styling React components. You get all the benefits of inline styles (encapsul ...
- [React] Higher Order Components (replaces Mixins)
Higher order components will allow you to apply behaviors to multiple React components. So the idea ...
- [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 ...
- angular2 学习笔记 ( Component 组件)
refer : https://angular.cn/docs/ts/latest/guide/template-syntax.html https://angular.cn/docs/ts/late ...
随机推荐
- linux--GCC简单用法
gcc是linux下最常用的一款c编译器,对应于CPP 有相应的g++工具,debug有gdb,只是还不会用. 个人感觉gcc确实是个好东西,完全可以直接在gedit下编程然后写个shell脚本用gc ...
- List转换为数组Array的方法
List<String> list = new ArrayList<String>(); list.add("str1"); list.add(" ...
- php数据访问之查询关键字
本文根据数据库中的car表做一个汽车查询页面,巩固php查询关键字操作,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了php查询操作的实现代码,供大家参考,具体内容如下 一.一个关键字查询 主 ...
- MUI 分享功能(微信、QQ 、朋友圈)
配置文件:manifest.json plus ->plugins 下边 "share": {/*配置应用使用分享功能,参考http://ask.dcloud.net.cn/ ...
- MQTT的学习研究(十三) IBM MQTTV3 简单发布订阅实例
使用IBM MQTTv3实现相关的发布订阅功能 MQTTv3的发布消息的实现: package com.etrip.mqttv3; import com.ibm.micro.client.mqttv3 ...
- PL/SQL developer 可以连接本地数据库,但是不可以连接远程数据库的解决方法
修改Oracle_home目录下的 network\ADMIN\tnsnames.ora 文件, 在其中增加远程数据库对应的记录,类似下边这样: .2_orcl = (DESCRIPTION = (A ...
- linux下nproc的作用
文章来源: http://blog.csdn.net/odailidong/article/details/50561257 nproc是操作系统级别对每个用户创建的进程数的限制,在Linux下运行多 ...
- 查询hadoop参数变量
[hadoop@master hadoop]$ hive -S -e 'set -v'|grep querylog|grep -E -v 'CLASSPATH|class'hive.querylog. ...
- Linux系列-Xshell连接本地VMware安装的Linux虚拟机
一.安装VMwareWorkstation并安装RedHat虚拟机,这里安装步骤省略,网络的资料很多,大侠们不如百度或者谷歌一下,大把的资料. 二.打开本地电脑的“网络连接”,你会发现多出了2个网络适 ...
- intelliij jdea 的file没有setting的解决方法