一、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. DM8168 PWM驱动与測试程序

    昨天把DM8168的Timer设置给摸了一遍,为写PWM的底层驱动做好了准备,如今就要进入主题了. dm8168_pwm.c: #include <linux/module.h> #inc ...

  2. org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Can

    org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Can ...

  3. java集合的中的集合关系实现或继承关系图

    放在这儿一目了然.

  4. Dubbo源码导入Eclipse遇到的问题

    1.怎么将Dubbo源码导入到Eclipse 方法一: 打开Eclipse,File-->Import-->maven-->Exsting Maven Projects,选择dubb ...

  5. Mysql全文搜索match against的用法

    全文检索在 MySQL 中就是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE ...

  6. 谷歌Volley网络框架讲解——Network及其实现类

    我们看到Network接口只有一个实现类BasicNetwork,而HttpStack有两个实现类. BasicNetwork这个类是toolbox工具箱包里的,实现了Network接口. 先来看下N ...

  7. 【Node.js】Mac 下安装node图文详解

    1  进入官网,下载node最新版 官网:https://nodejs.org/en/ 2 双击下载的安装包,一路默认安装就行 3  打开终端,输入以下命令查看结果,如出现下图信息则为安装成功 4   ...

  8. hibernate实现有两种配置,xml配置与注释配置。<转>

    <注意:在配置时hibernate的下载的版本一定确保正确,因为不同版本导入的jar包可能不一样,所以会导致出现一些错误> hibernate实现有两种配置,xml配置与注释配置. (1) ...

  9. 三维凸包(两个没有公共点)经过旋转平移后使其重心相距最近(POJ3862)

    Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 481   Accepted: 152   Special ...

  10. HOJ 2252 The Priest(动态规划)

    The Priest Source : 计算机学院第二届"光熙杯"程序设计大赛 Time limit : 3 sec Memory limit : 32 M Submitted : ...