学习目标
- 创建一个客户端控制器来处理用户操作。
- 从组件属性读取值。
- 从组件中的用户界面控件读取值。
- 用JavaScript编写控制器代码来改变用户界面。
处理与控制器的行动

这是helloMessageInteractive,很难想象一个简单的组件“做些什么”。它是一些静态文本,一个(当前空白)消息和两个按钮。代码如下:
<aura:component>
<aura:attribute name="message" type="String"/>
<p>Message of the day: {!v.message}</p>
<div>
<lightning:button label="You look nice today."
onclick="{!c.handleClick}"/>
<lightning:button label="Today is going to be a great day!"
onclick="{!c.handleClick}"/>
</div>
</aura:component>

我们将首先承认,并不是每一个你会在Lightning Components中看到的错误信息都像你所希望的那样有帮助。但是这个是!它说没有名为“handleClick”的控制器操作。 “handleClick”从哪里来?它来自我们分配给两个<lightning:button>标签中每一个的onclick属性的表达式:
onclick="{!c.handleClick}"

Uh, 什么是控制器?
哎呦!控制器基本上是一组代码,用于定义应用程序在“事情发生”时的行为,其中“事物”是指用户输入,定时器和其他事件,数据更新等等。如果你在任何数量的开发者网站上查找“模型 - 视图 - 控制器”,你会得到不同的定义。就我们的目的而言,对于Lightning组件,控制器是组件包中的一个资源,该组件包含该组件的操作处理程序。而动作处理程序只是具有特定功能签名的JavaScript函数。
超越基础
我们在这个单元中谈了很多关于控制器的知识,而且我们知道这个组件本身就是一个视图。我们甚至提到了MVC或模型 - 视图 - 控制器的设计模式,这在Web应用程序框架中很常见。闪电组件建立在MVC模式上吗? 总之,没有。可以肯定的是有相似之处,但是说Lightning组件是View-Controller-Controller-Model或者View-Controller-Controller-Database可能更为正确。 为什么“控制器”在这个模式名称翻倍?因为在与Salesforce交互时,除了我们在本单元中使用的客户端控制器外,您的组件还将拥有服务器端控制器。这个双控制器设计是Lightning组件和MVC之间的主要区别。 “模型”和“数据库”有什么区别?在传统的MVC中,模型是底层数据存储(通常是关系数据库)和其他应用程序之间的程序化抽象(通常是一个类)。在Lightning组件中,没有Apex类直接位于@AuraEnabled控制器方法和DML操作之间。但是再一次,sObjects已经是您的Apex代码和底层存储层之间的抽象了。您可以添加计算字段,验证逻辑,甚至以触发器的形式添加完全的编程行为。那么,这是一个数据库还是一个模型?我们说po-TAY-tow,但是如果你想用po-TAH-tow去,那真是太酷了。 困惑?激动吗?我们将在后面的单元中对服务器端控制器的细节进行分类。 让我们更详细地看看helloMessageInteractive控制器,并解释更具体一些。({
handleClick: function(component, event, helper) {
var btnClicked = event.getSource(); // the button
var btnMessage = btnClicked.get("v.label"); // the button's label
component.set("v.message", btnMessage); // update our message
}
})
行动处理程序

很简单,对吧?好…
因为这是非常重要的,让我们逐行分解。
handleClick: function(component, event, helper) {
操作处理程序名称,后跟一个匿名函数声明。这里重要的是函数签名。虽然这不是技术上的要求,但您应该始终声明您的控制器功能采取这三个参数。现在我们将更多地讨论它们,但是现在这些参数代表:
- component—组件。在这种情况下,它是helloMessageInteractive。
- event—导致操作处理程序被调用的事件。
- helper—组件的助手,另一个可重用函数的JavaScript资源。
var btnClicked = event.getSource(); // the button
var btnMessage = btnClicked.get("v.label"); // the button's label
component.set("v.message", btnMessage); // update our message
闪电组件视图 - 控制器编程模型

函数链接,重新布线和简单调试
我们的handleClick的第一个版本是三行代码,因为我们将get-process-set模式中的每一步分解成单独的行。你可以使用一些叫做函数链的东西把它们折成较少的行。由于您可能会在其他Lightning组件代码中看到这一点,因此我们可以让它自己旋转。在handleClick之后,将以下附加代码添加到helloMessageInteractive控制器中。
handleClick2: function(component, event, helper) {
var newMessage = event.getSource().get("v.label");
component.set("v.message", newMessage);
},
handleClick3: function(component, event, helper) {
component.set("v.message", event.getSource().get("v.label"));
}
handleClick2: function(component, event, helper) {
var newMessage = event.getSource().get("v.label");
console.log("handleClick2: Message: " + newMessage);
component.set("v.message", newMessage);
},