一、The {{action}} Helper

你的应用程序通常会需要一种方法来让用户用控件交互改变应用程序状态。

例如,你有一个显示blog post的模板,并支持用额外的信息扩展post。

可以使用{{action}}去让一个HTML元素可点击。当用户点击这个元素,命名的事件将会被发送到你的应用程序。

app/templates/post.hbs

<div class='intro'>
{{intro}}
</div> {{#if isExpanded}}
<div class='body'>{{body}}</div>
<button {{action 'contract'}}>Contract</button>
{{else}}
<button {{action 'expand'}}>Show More...</button>
{{/if}}

app/controllers/post.js

export default Ember.Controller.extend({
intro: Ember.computed.alias('model.intro'),
body: Ember.computed.alias('model.body'), // initial value
isExpanded: false, actions: {
expand() {
this.set('isExpanded', true);
}, contract() {
this.set('isExpanded', false);
}
}
});
  • 注意actions可以附加到任何DOM元素,但并不是所有的都响应单击事件。例如如果一个action被附加到了一个没有href属性的a标签上,或者一个div,一些浏览器将不会执行相关的function。
  • 如果真的需要为这些元素定义这些actions,一个CSS可以使它们可点击,cursor: pointer
  • [data-ember-action] {
    cursor: pointer;
    }

二、Action Bubbling(Action 冒泡)

1.默认,{{action}}触发模板的controller上的方法,正如上文所述。

如果在actions对象中controller没有实现和它同名的方法,这个action会被发送到路由器,当前活动的子路由将会有机会处理这个action。

处理actions的routes和controllers必须将action handlers放置在一个actions hash中。即使一个路由有一个与actions同名的方法,除非它是在actions的哈希表中,否则不会被触发。在controllers的例子中,虽然在controller上有不支持直接触发的方法,还是强烈建议把你的actions处理方法放入一个actions哈希表中,以向前兼容。

app/routes/post.js

export default Ember.Route.extend({
actions: {
expand() {
this.controller.set('isExpanded', true);
}, contract() {
this.controller.set('isExpanded', false);
}
}
});

你可以看到,action的处理程序被调用时执行,thisroute,而不是actions hash。

2. 为了让action继续冒泡,你必须从处理程序中返回true

app/routes/post.js

export default Ember.Route.extend({
actions: {
expand() {
this.controller.set('isExpanded', true);
}, contract() {
// ...
if (actionShouldAlsoBeTriggeredOnParentRoute) {
return true;
}
}
}
});

3. 如果模板的控制器和当前活动路由没有实现一个处理程序,该action将继续查找任何父路由。最终,如果一个ApplicationRoute被定义了,它将会有机会处理这个action。

4. 当一个action被触发,但是在controller,当前route或者任何当前route的祖先中没有找到匹配的action处理程序,将会抛出错误。

5. 查找action handler的过程如下图所示:

6. 这允许你创建一个按钮,但是基于应用程序的不同位置具有不同的行为。例如,当是/posts路由的时候你可能想在侧边栏有一个按钮做一件事,当是/about路由的时候做另外一件事。

三、Action Parameters

你可以有选择的给aciton处理程序传递参数。任何值都是在action name作为参数被传递给handler之后被传递给{{action}} helper的。

例如,如果post参数被传递:

<p><button {{action "select" post}}>✓</button> {{post.title}}</p>

controller的select action处理程序会被调用,使用一个包含post model的单个参数:

app/controllers/post.js

export default Ember.Controller.extend({
actions: {
select(post) {
console.log(post.get('title'));
}
}
});

四、Specifying the type of event

默认的,当用户点击元素时{{action}} helper监听click事件并触发action。

你可以通on选项指定可选择的事件:

<p>
<button {{action "select" post on="mouse-up"}}>✓</button>
{{post.title}}
</p>

你应该使用dasherized事件名。一般,两个单词的事件名(像keypress)写成key-press

五、Specifying Whitelisted modifier keys(白名单)

默认的,当用户click这个元素时{{action}}将会忽略键盘上按键的click事件。你可以提供一个allowedKeys选项指定那些keys不应该被忽略。

<button {{action 'anActionName' allowedKeys="alt"}}>
click me
</button>

这样,{{action}}在键盘上的"alt"键按下时将被触发。

六、Default Action

默认的,通过{{action}}在所有处理的事件中event.preventDefault()会被调用。避免这样可以添加参数preventDefault=false

七、Stopping Event Propagation(停止传播事件)

默认的,{{action}}允许事件处理冒泡到父节点。如果你想停止事件冒泡,你可以在父节点中 disable propagation。

例如,如果在一个链接中有一个X按钮,你希望当用户点击X时保证link没有被点击:

{{#link-to 'post'}}
Post
<button {{action 'close' bubbles=false}}>✗</button>
{{/link-to}}
  • 没有bubbles=false的话,如果用点击按钮,Ember会触发这个action,并且将会把click传播到link。
  • 如果有bubbles=false,Ember将会阻止浏览器传播该事件。

八、Handing an Action
{{action}}发送action从一个组件模板到另外一个组件。

你可以通过在组件中添加一个包含和action同名方法的actions hash来处理一个action。

例如,假设这个模板为按钮添加select action。

app/templates/component/show-posts.hbs

<button {{action "select" model}}>Select Post</button>

你可以实现一个function通过添加包含一个名为select的方法的actions hash来响应按钮的点击。

app/components/show-post.js

export default Ember.Component.extend({
actions: {
select(post) {
// do your business.
}
}
});

九、Allowing Default Browser Action

默认的,{{action}}阻止DOM事件默认的浏览器行为。如果你想允许浏览器行为,你可以通过阻止它来停止ember。

例如,如果你有一个普通的link并希望点击的时候该链接带用户去另一个页面而不是触发一个ember action:

<a href="newPage.htm" {{action 'logClick' preventDefault=false}}>Go</a>
  • 没有preventDefault=false的话,如果用户点击该链接,Ember将会触发action,但是用户仍然在当前页面。
  • 有preventDefault=false的话,如果用点击该链接,Ember将会触发action,用户会被导向新页面。

3.8 Templates -- Actions的更多相关文章

  1. 基于 bootstrap 的数据展示--bootgrid 样式改动。

    bootgrid 的官网案例 http://www.jquery-bootgrid.com/Examples 官方demo 样式 基于项目须要,取消了一些不须要 的功能,改动了源代码 最后样式成了这样 ...

  2. (转)编码规范系列(一):Eclipse Code Templates设置

    背景:长久以来,对java编程中的注释不甚理解.再次学习<疯狂JAVA讲义>基础,深深的感到自己基本功的不牢固.所以要做到事无巨细,好好修炼. 认识注释 常识 注释的作用: 回顾原有的代码 ...

  3. 5.6 Components -- Handling User Interaction with Actions

    1. 组件允许你定义可以在整个应用程序中重用的控件.如果它们够通用,它们也可以在被共享给其他人并且在许多应用程序中被使用. 2. 为了使一个可重用的控件有用,然而,你首先需要你的应用程序的用户和它交互 ...

  4. 5.7 Components — Sending Actions From Components to Your Application

    一.概述 1. 当一个组件在模板中被使用时,它具有发送action到这个模板的controller和routes的能力.当重大事件发生的时候,这些允许组件通知application,比如点击组件一个特 ...

  5. [Nuxt] Update State with Vuex Actions in Nuxt.js

    You can conditionally add classes to Vue.js templates using v-bind:class. This will help display the ...

  6. odoo通过actions.client进行自定义页面

    一.使用原因 由于odoo自带页面在项目开发过程中无法满足使用,需要使用到动作ir.actions.client进行自定义视图的开发,实现自定义的xml视图开发. 二.实现目标 三.开发过程 1.项目 ...

  7. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  8. 解决Windows版Git出现templates not found的问题

    环境: Win10 x64 Git windows客户端(下载自 https://git-scm.com/) SourceTree 1.9.6.1(使用系统安装的Git,而非SourceTree内嵌的 ...

  9. [大数据之Spark]——Actions算子操作入门实例

    Actions reduce(func) Aggregate the elements of the dataset using a function func (which takes two ar ...

随机推荐

  1. Recurrent Neural Network Language Modeling Toolkit代码学习

    Recurrent Neural Network Language Modeling Toolkit  工具使用点击打开链接 本博客地址:http://blog.csdn.net/wangxingin ...

  2. thinkphp nginx+phpcgj安装配置

    环境:mysql-5.6.26             nginx-1.9.4.tar.gz   php-5.6.13 程序框架ThinkPHP 客户要求必须使用nginx + php 1.首先安装n ...

  3. Tomcat连接参数的优化,主要是针对吞吐量做优化

    Tomcat连接参数的优化,主要是针对吞吐量做优化: 修改conf/server.xml文件,把原来 <Connector port="8080" protocol=&quo ...

  4. Python 流程控制:if

    语法: if 判断条件1: # 如果判断条件1成立,就执行语句1 语句1... if 判断条件1: # 如果判断条件1成立,就执行语句1,否则执行语句2 语句1... else: 语句2... if ...

  5. VS添加命令行参数main(int argc, char** argv)

  6. UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView

    « 对Cocos2d游戏引擎有一定的了解和实践,并接触过处理3D图形和模型库的OpenGL 在进行游戏界面的绘制工作中,需要处理大量的工作,这些工作有很多共性的操作:并且对于游戏界面的切换,元素动作的 ...

  7. OpenGL超级宝典总结(二)2D/3D笛卡尔坐标、坐标裁剪、纹理坐标、MVP转换等概念

    如果你想把图形渲染在正确的位置上,那么坐标的设置就很重要了.在OpenGL中,与坐标相关的主要有笛卡尔坐标.坐标裁剪.纹理坐标.MVP(Model View Projection)转换. 1.笛卡尔坐 ...

  8. @ResponseBody将集合数据转换为json格式并返回给客户端

    spring-mvc.xml: <beans xmlns:mvc="http://www.springframework.org/schema/mvc" > <m ...

  9. hive 客户端执行select count(1) from t_sz01

    yarn-site.xml配置错误 yarn.nodemanager.aux-services 中的-原先配置为_ 导致错误......

  10. poj_1988 并查集

    题目大意 开始有N堆砖块,编号为1,2....N,每堆都只有一个.之后可以进行两种操作: (1)M X Y 将编号为X的砖块所在的那堆砖拿起来放到编号为Y的砖块所在的堆上: (2)C X 查询编号为X ...