在刷trail badge时遇到的例子,觉得很典型,复制粘贴如下,以后可参考。
component.cmp 这里 force:recordData的用法以及form的标签
<aura:component implements="force:lightningQuickActionWithoutHeader,force:hasRecordId">
<aura:attribute name="user" type="Test_User__c" default="{}"/>
<aura:attribute name="hasErrors" type="Boolean" description="Indicate whether there were failures or not" />
<aura:attribute name="caseStudy" type="String" />
<aura:attribute name="recordId" type="String"/>
<aura:attribute name="errorFromCreate" type="String"/>
<!-- <aura:handler name="init" value="{!this}" action="{!c.init}" /> -->
<force:recordData aura:id="frd" mode="EDIT" layoutType="FULL"/>
<div class="slds-page-header" role="banner">
<p class="slds-text-heading--label">Case Study</p>
<h1 class="slds-page-header__title slds-m-right--small slds-truncate slds-align-left" title="Case Study Title">{!v.caseStudy}</h1>
</div>
<br/>
<aura:if isTrue="{!v.hasErrors}">
<div class="userCreateError">
<ui:message title="Error" severity="error" closable="true">
Please review the error messages.
</ui:message>
</div>
</aura:if>
<div class="slds-form--stacked">
<div class="slds-form-element">
<label class="slds-form-element__label" for="firstName">Enter first name: </label>
<div class="slds-form-element__control">
<ui:inputText class="slds-input" aura:id="firstName" value="{!v.user.First}" required="true" keydown="{!c.updateNickname}" updateOn="keydown"/>
</div>
</div>
<div class="slds-form-element">
<label class="slds-form-element__label" for="lastName">Enter last name: </label>
<div class="slds-form-element__control">
<ui:inputText class="slds-input" aura:id="lastName" value="{!v.user.Last}" required="true" />
</div>
</div>
<div class="slds-form-element">
<label class="slds-form-element__label" for="nickname">Enter nickname: </label>
<div class="slds-form-element__control">
<ui:inputText class="slds-input" aura:id="nickname" value="{!v.user.Nickname}" required="false"/>
</div>
</div>
<div class="slds-form-element">
<label class="slds-form-element__label" for="userEmail">Enter user's email:</label>
<div class="slds-form-element__control">
<ui:inputEmail class="slds-input" aura:id="userEmail" value="{!v.user.Email__c}" required="true"/>
</div>
</div>
<div class="slds-form-element">
<label class="slds-form-element__label" for="userPassword">Enter user's password:</label>
<div class="slds-form-element__control">
<ui:inputSecret class="slds-input" aura:id="userPassword" value="{!v.user.Password__c}" required="true"/>
</div>
</div>
<div class="slds-form-element">
<ui:button class="slds-button slds-button--neutral" press="{!c.cancel}" label="Cancel" />
<ui:button class="slds-button slds-button--brand" press="{!c.saveUserForm}" label="Save User" />
</div>
</div>
</aura:component>
controller.js 这些e.force:xxxxevent的使用
({
/**
* Auto generate the username from firstName on tab
*/
updateNickname: function(component, event, helper) {
// Update the nickname field when 'tab' is pressed
if (event.getParams().keyCode == 9) {
var nameInput = component.find("firstName");
var nameValue = nameInput.get("v.value");
var nickName = component.find("nickname");
var today = new Date();
nickName.set("v.value", nameValue + today.valueOf(today));
}
},
/**
* Capture the Inputs and invoke the helper.save with the input params
*/
saveUserForm : function(component, event, helper) {
var name = component.get("v.user.First");
var last = component.get("v.user.Last");
var password = component.get("v.user.Password__c");
var email = component.get("v.user.Email__c");
var nickname = component.get("v.user.Nickname");
var passwordCmp = component.find("userPassword");
var emailCmp = component.find("userEmail");
helper.validatePassword(component, event, helper);
helper.validateEmail(component, event, helper);
if (passwordCmp.get("v.errors") == null && emailCmp.get("v.errors") == null) {
component.set("v.hasErrors", false);
helper.save(component, name + " " + last, password, email, nickname);
} else {
component.set("v.hasErrors", true);
}
},
cancel : function(component, event, helper) {
$A.get("e.force:closeQuickAction").fire();
}
})
helper.js userRecord的组建结构以及saveRecord的callback的创建方法
({
save: function(component, name, password, email, nickname) {
// Create a user record, save it, and close the panel
var userRecord = {apiName: 'Test_User__c', fields: {}};
userRecord.fields.Name = {value: name};
userRecord.fields.Password__c = {value: password};
userRecord.fields.Email__c = {value: email};
userRecord.fields.Nickname__c = {value: nickname};
userRecord.fields.Case_Study__c = {value: component.get("v.recordId")};
// get the force:recordData and set the targetRecord
component.find("frd").set('v.targetRecord', userRecord);
// invoke saveRecord of force:recordData
component.find("frd").saveRecord($A.getCallback(function(response) {
if (component.isValid() && response.state == "SUCCESS") {
$A.get("e.force:closeQuickAction").fire();
var toastEvent = $A.get("e.force:showToast");
toastEvent.setParams({
"title": "Success!",
"message": "The test user has been created."
});
toastEvent.fire();
$A.get('e.force:refreshView').fire();
} else if (response.state == "ERROR") {
console.log('There was a problem and the state is: '+ response.state);
}
}));
},
validatePassword : function(component, event, helper) {
var inputCmp = component.find("userPassword");
var value = inputCmp.get("v.value");
if (value == undefined) {
inputCmp.set("v.errors", [{message: "You must enter a password."}]);
} else if (value.length < 7 || value.length > 15) {
inputCmp.set("v.errors", [{message: "The password is the wrong length (must be <= 15): " + value.length}]);
} else if (value.search(/[0-9]+/) == -1) {
inputCmp.set("v.errors", [{message: "The password must contain at least one number."}]);
} else if (value.search(/[a-zA-Z]+/) == -1) {
inputCmp.set("v.errors", [{message: "The password must contain at least one letter."}]);
} else {
inputCmp.set("v.errors", null);
}
},
validateEmail : function(component, event, helper) {
var inputCmp = component.find("userEmail");
var value = inputCmp.get("v.value");
if (value == undefined) {
inputCmp.set("v.errors", [{message: "You must enter an email."}]);
return;
}
var apos = value.indexOf("@");
var dotpos = value.lastIndexOf(".");
if (apos<1||dotpos-apos<2){
inputCmp.set("v.errors", [{message: "Email is not in the correct format: " + value}]);
} else if (value.substring(apos+1, dotpos) != "gmail") {
inputCmp.set("v.errors", [{message: "Email must be a gmail account: " + value.substring(apos+1, dotpos)}]);
} else {
inputCmp.set("v.errors", null);
}
}
})