Ember.js 入门指南——action触发变化

组件就像一个相对独立的盒子。在前面的文章中介绍过组件是怎么通过属性传递参数,并且这个属性值你可以在模板或者js代码中获取。

但是到目前为止还没介绍过子组件从父组件中获取数组,在Ember应用中组件之间的通信是通过actions实现的。

跟着下面的步骤来,创建一个组件之间通信的示例。

1,创建组件

创建组件的方法不用我多说,直接使用Ember CLI命令创建即可。

ember g component button-with-confirmation
ember g component user-profile
ember g route button-with-confirmation-route

为了测试方便多增加了一个路由。

下面是组件user-profile的定义,调用组件button-with-confirmation,那么此时user-profile作为父组件,button-with-confirmation作为子组件:

<!--  app/temlates/components/user-profile.hbs  -->
 
{{button-with-confirmation text="Click OK to delete your account"}}
2,在组件类中添加action

要想action能执行需要作如下两步:

  1. 在父组件中定义好需要处理的动作(action)。在这个例子中父组件的动作是要删除用户账号并发送一个提示信息到另一个组件。
  2. 在子组件中,判断发生什么事件并发出通知信息。在这个例子中当用户点击“确认”按钮之后触发一个外部的动作(删除账户或者发送提示信息)。

下面是实现代码:

实现父组件动作(action)

在父组件中,定义好当用户点击“确认”之后触发的动作。在这个例子中的动作(action)是先找出用户账号再删除。

在Ember应用中,每个组件都有一个名为actions的属性。这个属性值是函数,是可以被用户或者子组件执行的函数。

//  app/components/user-profile.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       actions: {
              userDidDeleteAccount: function() {
                     console.log(“userDidDeleteAccount…”);
              }
       }
});

现在已经实现了父组件逻辑,但是并没有告诉Ember这个动作什么时候触发,下一步将实现这个功能。

实现子组件动作(action)

这一步我们将实现当用户点击“确定”之后触发事件的逻辑。

//  app/components/button-with-confirmation.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       tagName: ‘button‘,
       click: function() {
              if (confirm(this.get(‘text‘))) {
                     // 在这里获取父组件的事件(数据)并触发
              }
       }
});
3,传递action到组件中

现在我们在user-profile组件中使用onConfirm()方法触发组件button-with-confirmation类中的userDidDeleteAccount事件。

<!--  app/temlates/components/user-profile.hbs  -->
 
{{#button-with-confirmation text="Click OK to delete your account" onConfirm=(action ‘userDidDeleteAccount‘)}}
执行userDidDeleteAccount方法
{{/button-with-confirmation}}

这段代码的意思是告诉父组件,‘userDidDeleteAccount‘方法会通过onConfirm方法执行。

现在你可以在子组件中使用onConfirm方法执行父组件的动作。

//  app/components/button-with-confirmation.js
 
import Ember from ‘ember‘;
 
export default Ember.Component.extend({
       tagName: ‘button‘,
       click: function() {
              if (confirm(this.get(‘text‘))) {
                     // 在父组件中触发动作
                     this.get(‘onConfirm‘)();
              }
       }
});

this.gete(“onConfirm”)从父组件返回一个值“onConfirm”,然后与“()”组合成了一个个方法onConfirm()。

在模板button-with-confirmation-route.hbs中调用组件。

<!--  app/temlates/button-with-confirmation-route.hbs  -->
 
{{user-profile}}

最后是运行结果:

点击这个button,会触发事件。弹出对话框。再点击“确认”后执行方法userDidDeleteAccount,可以看到浏览器控制台输出了“userDidDeleteAccount…”,未点击“确认”前或者点击“取消”不会输出这个信息,说明不执行这个方法userDidDeleteAccount。

像普通属性,actions可以组件的一个属性,唯一的区别是,属性设置为一个函数,它知道如何触发的行为。

在组件的actions属性中定义的方法,允许你决定怎么去处理一个事件,有助于模块化,提高组件重用率。

到此,组件这一章节的内容全部介绍完毕了,不知道你看懂了多少?如果有疑问请给我留言一起交流学习,获取是直接去官网学习官方教程

时间: 2024-11-07 22:42:54

Ember.js 入门指南——action触发变化的相关文章

Ember.js 入门指南——{{action}} 助手

本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站. 文章地址:http://ibeginner.sinaapp.com/index.php?m=Home&c=Index&a=detail&id=61d90a090c764ccf0e2efdcfe1db295f 今天累了,偷个懒!!!!! ?

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

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

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

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

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

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

Ember.js 入门指南——路由简介

从本文开始,将为大家介绍路由(route),如果你看过前面的<Ember.js 入门指南--{{link-to}} 助手>这篇文章应该初步了解了route.不过在这篇文章中只是简单介绍了路由是定义.路由层次,更深入的route将从本文开始逐一介绍. 当用户使用你的应用时,应用要在不同的状态之间切换.Ember提供了很多工具用于管理那些因应用规模改变而改变的状态. 讲route前先了解URL,在应用中大概会会有如下方式设置URL: 用户第一次加载应用的时: 用户手动改变URL,比如点击按钮之后跳

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 入门指南——model简介2

本文接上一篇<Ember.js 入门指南--model简介1>. 2,核心概念 声明:下面简介内摘抄至http://www.emberjs.cn/guides/models/#toc_. 1,store store是应用存放记录的中心仓库.你可以认为store是应用的所有数据的缓存.应用的控制器和路由都可以访问这个共享的store:当它们需要显示或者修改一个记录时,首先就需要访问store. DS.Store的实例会被自动创建,并且该实例被应用中所有的对象所共享. store可以看做是一个缓存

Ember.js 入门指南--目录

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