JSRUN 用代码说话

action触发变化

编辑教程

action触发变化

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

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

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

创建组件

创建组件的方法不用我多说,直接使用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作为子组件:

{{button-with-confirmation text="Click OK to delete your account"}}

在组件类中添加action

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

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

下面是实现代码:

实现父组件动作(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'))) {
            // 在这里获取父组件的事件(数据)并触发
        }
    }
});

传递action到组件中

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


{{#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中调用组件。

{{user-profile}}
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟