5.7 Components — Sending Actions From Components to Your Application

一、概述

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

2. 像{{action}}Handlebars辅助器,来自组件的actions首先会去到模板的controller。如果controller没有为这个action实现一个处理程序,它将会冒泡到模板的route,然后上升到路由层次。要知道更多的关于冒泡行为的信息,请看Action Budding

3. 组件被设计为可重用的,在你的应用程序的不同部分。为了达到这个重用性,这是很重要的,当组件被用在模板中时,被你的组件发送的actions可以被制定。

4.换句话说,如果你在编写一个按钮组件,你不想发送一个click action,因为它是含糊不清的并且可能与页面上的其他组件冲突。想法,当你的按钮被点击时,你会希望允许他人使用组件去指定发送哪一个action。

5.幸运的是,组件又一个sendAction()方法,当一个组件被用在一个模板中时,它允许它们发送指定的actions。

二、Sending a primary action

1. 许多组件仅仅发送一类action。例如,一个按钮组件当被点击时可能发送一个action,这个就是primary action

2. 为了设置一个组件的primary action,在Handlebars中设置它的action属性:

{{my-button action="showUser"}}

这就告诉my-button组件,当它出发它的primary action时它应该发送showUser action

3. 那么你如何触发发送一个组件primary action的操作呢?在相关的事件发生之后,你可以不含参数的调用sendAction()方法:

app/components/my-button.js

export default Ember.Component.extend({
  click() {
    this.sendAction();
  }
});

再上面例子中,当这个组件被点击的时候,my-button组件将会放showUser action

三、Sending parameters with an action

1. 你可能希望为route或者controller提供额外的上下文来处理一个action。例如,一个按钮组件可能希望告诉一个controller不仅一条数据被删除了,而且还有其他的。

2. 为了使用primary action发送参数,调用sendAction()附件一个‘action‘字符串作为第一个参数并且其他多余的参数紧随其后:

this.sendAction(‘action‘, param1, param2);

例如,假象我们正在创建一个todo list,允许用户删除一个todo:

app/routes/index.js

export default Ember.Route.extend({
  model() {
    return {
      todos: [{
        title: "Learn Ember.js"
      }, {
        title: "Walk the dog"
      }]
    };
  },

  actions: {
    deleteTodo(todo) {
      var todos = this.modelFor(‘index‘).todos;
      todos.removeObject(todo);
    }
  }
});

app/templates/index.hbs

{{#each model.todos as |todo|}}
  <p>{{todo.title}} <button {{action "deleteTodo" todo}}>Delete</button></p>
{{/each}}

3. 我们希望更新这个app,所以在真正删除一个todo之间,用户必须确认这就是它们的打算。我们将实现一个组件在完成action之前首先和用户二次检查。

在这个组件中,我们出发primary action,我们将传送一个组件的用户可以指定的额外参数:

app/components/confirm-button.js

export default Ember.Component.extend({
  actions: {
    showConfirmation() {
      this.toggleProperty(‘isShowingConfirmation‘);
    },

    confirm() {
      this.toggleProperty(‘isShowingConfirmation‘);
      this.sendAction(‘action‘, this.get(‘param‘));
    }
  }
});

app/templates/components/confirm-button.hbs

{{#if isShowingConfirmation}}
  <button {{action "confirm"}}>Click again to confirm</button>
{{else}}
  <button {{action "showConfirmation"}}>{{title}}</button>
{{/if}}

现在我们可以更新我们最初的模板并且用我们的新组建替换{{action}}

4. 注意,我们已经通过设置组件的action属性来发送指定的action,并且我们已经通过设置组件的param属性指定了哪一个argument应该被作为参数被传送。

四、Sending multipe actions

1. 根据你的组件的复杂性,你可能需要让用户为你的组件生成的不同的事件指定多个不同的actions。例如,假设你正在编写一个form组件,用户可以提交或者取消。根据用户点击哪一个按钮,你希望发送不同的aciton到你的controller或者route。

2. 你可以通过把事件的名字作为第一个参数传递给sendAction()来指定哪一个action被传送。

{{user-form submit="createUser" cancel="cancelUserCreation"}}

在这种情况下,你可以通过this.sendAction(‘submit‘)发送createUser action,或者通过调用this.sendAction(‘cancel‘)发送cancelUserCreation action

五、Actions that aren‘t specified

如果用户使用你的组件没有为一个特殊的事件指定一个action,调用sendAction()将毫无影响。例如,你定义一个组件当点击的时候触发primary action:

app/components/my-button.js

export default Ember.Component.extend({
  click() {
    this.sendAction();
  }
});

如果用户点击它,使用这个组件不委派一个primary action将会没有任何反应。

{{my-button}}

六、Thinking about component actions

1. 一般情况下,你应该考虑组件的actions作为翻译一个primitive event(原始事件)(例如鼠标点击或者一个<audio>元素的暂停事件)到应用程序中有意义的actions。

2. 这允许你的routes和controllers去实现acton处理器,用类似这样的名字deleteTodo或者songDidPause而不是模糊的名字类似clike或者pause,对其他开发者来,当在上下文之外阅读代码,这种名字可能是模糊的。

3. 另一种考虑组件actions的途径是作为你的组件的公共API。考虑组件中的哪一个事件可以在其他应用程序中触发actions,这是其他开发者将使用你的组件的主要途径。一般来说,保持这些事假越通用越好,这会使组件更加灵活和可重用。

时间: 2024-10-09 11:10:09

5.7 Components — Sending Actions From Components to Your Application的相关文章

Giraph添加应用程序Weakly Connected Components算法

本人原创,转载请注明出处! 本人QQ:530422429,欢迎大家指正.讨论. 目的:举例说明如何在Giraph中添加应用程序,以WCC(Weakly Connected Components)算法为例,描述怎么添加Vertex的子类,自定义输入输出格式和使用Combiner等. 背景:Giraph源码中自带有WCC算法,类为:org.apache.giraph.examples.ConnectedComponentsVertex,代码如下: package org.apache.giraph.

The differences between Java EE components and &quot;standard&quot; Java classes

https://docs.oracle.com/javaee/7/tutorial/overview003.htm ava EE components are written in the Java programming language and are compiled in the same way as any program in the language. The differences between Java EE components and "standard" J

[React] React Router: Named Components

In this lesson we'll learn how to render multiple component children from a single route. Define a named component by "components": <Route path="/other" components={ {header: Other, body: OtherBody}}></Route> 'header' and '

【转】(五)unity4.6Ugui中文教程文档-------概要-UGUI Interaction Components

原创至上,移步请戳:(五)unity4.6Ugui中文教程文档-------概要-UGUI Interaction Components 4.Interaction Components 本节涵盖了处理交互,例如鼠标或触摸事件和使用键盘或控制器交互的 UI系统中的组件. 4.1 Selectable BaseClass 所有交互组件都有一些共同点.selectables是他们所有的控件的基类,这意味着他们都有共享状态,之间的前瞻转换和导航到其他使用键盘或控制器的selectables 的内置功能

iOS SDK详解之NSCalendar &amp; NSDate?Components

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢饮关注我的iOS SDK详解专栏 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 前言:NSCalendar 和 NSDate?Components是有关iOS 时间相关API很重要的两个类.最近刚好用到,这里就整理下. 概念 NSCalendar 顾名思义就是日历,封装了系统如何按照年月日的方式来组织时间,组织时间的方式和地区,时区有很大关

【转】(四)unity4.6Ugui中文教程文档-------概要-UGUI Visual Components

原创至上,移步请戳:(四)unity4.6Ugui中文教程文档-------概要-UGUI Visual Components 3.Visual Components 有新的组件和游戏对象已添加到uGUI,允许和容易的创建GUI特定功能.这一节将介绍新的游戏物体被创建的基础. 3.1 Text 该Text 组件,也被称为是一个标签,有一个Text 区域用于输入将显示的文本.它是可以设置的字体.字体样式.字体大小和是否使用RichText的能力. 文本的对齐方式alignment和自动换行Wrap

ExtJS笔记5 Components

参考 :http://blog.csdn.net/zhangxin09/article/details/6914882 An Ext JS application's UI is made up of one or many widgets called Components. All Components are subclasses of theExt.Component class which allows them to participate in automated lifecycl

开发者工具上正常运行而真机调试时出现“Component is not found in path &quot;components……Error: Component is not found in path ”

在开发者工具上编译时可以很“正常”地过(就是效果出来了,而且控制台上也没有报错或警告),但是,一旦进行真机调试时就出现下面的错误 这个错误貌似还挺常见的,特别是有时候自定义组件时疏漏了点东西,常见错误的解决可以看这篇博客, 以下记录一下我自己挖坑给自己跳的骚操作! 按照上面的错误提示:“Error: Component is not found in path "components/searchbar/searchbar" (using by "pages/index/in

Magento2 UI components概述

来源:宝鸡SEO UI components 概述Magento UI components 是用来展示不同的UI元素,比如表,按钮,对话框等.他们被用于简单灵活的交互界面渲染.Components被用来渲染结果界面,提供进一步的与javascript组件和服务器的交互.Magento UI components被实现为一个标准的模块叫Magento_UI.想要在你的模块里面使用UI Components,你需要在你的composer.json文件里面添加对Magento_UI的依赖.以下XSD