lightning components workshop v2

57
Building Lightning Components Christophe Coenraets Developer Evangelist #TrailheadLive @ccoenraets

Upload: christophe-coenraets

Post on 09-Apr-2017

456 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Lightning Components Workshop v2

Building Lightning ComponentsChristophe CoenraetsDeveloper Evangelist

#TrailheadLive@ccoenraets

Page 2: Lightning Components Workshop v2

http://developer.salesforce.com/trailhead/projects

Page 3: Lightning Components Workshop v2

What you will do

Build an Account Locator built as a a set of loosely coupled components communicating through events Explore different deployment options:• Lightning App• Salesforce1 App• App Builder Composition

AccountMap

AccountList

AccountLocator

AccountListItem

Page 4: Lightning Components Workshop v2

Step 1:Setting Up Your Environment

Page 5: Lightning Components Workshop v2

1. Sign up for a Developer Edition Org2. Enable My Domain3. Deploy to Users

Challenge

Page 6: Lightning Components Workshop v2

Step 2:Enabling Geolocation on Accounts

Page 7: Lightning Components Workshop v2

1. Add a geolocation field to the Account object2. Enter sample data

Challenge

Page 8: Lightning Components Workshop v2

Step 3:Creating an Aura-Enabled Controller

Page 9: Lightning Components Workshop v2

Visualforce Page-Centric Model

1. Browser requests page

Client Server

4. Browser renders html

2.Server executes Apex code3.Server returns page (html + data)

Show different data? Back to 1Show different view? Back to 1

Page 10: Lightning Components Workshop v2

Pros1. Proven model2. Productivity. Easy to implement3. Naturally splits large apps into small, manageable units (pages)

Caveats4. Limited interactivity5. Higher latency

Visualforce Page Centric Model

Page 11: Lightning Components Workshop v2

Lightning App-Centric Model

1. Browser requests Component

Client Server

3. Browser builds UI with JavaScript

4. Browser requests data

7. Back to 3

2.Server returns Component Bundle

5. Server executes Apex6.Server returns data (data only!)

Show different data? Back to 4Show different view? Back to 3

Page 12: Lightning Components Workshop v2

Pros• Enables highly interactive/immersive user experiences• Less page refreshes• Tightly integrated (no iframe)• Composable

Caveats• Higher learning curve compared to vanilla Visualforce pages• Higher level of complexity. Building an app is generally more complex than building a

page

Lightning Components App Centric Model

Page 13: Lightning Components Workshop v2

Creating an Aura-Enabled Apex Controller

public with sharing class AccountController {

@AuraEnabled public static List<Account> findAll() { return [SELECT id, name FROM Account]; }

}

* You should add code to enforce CRUD and FLS

Page 14: Lightning Components Workshop v2

1. Create an Aura-enabled Apex controller named AccountController

2. Add a findAll() method that returns accounts that have location information

Challenge

Page 15: Lightning Components Workshop v2

Step 4:Creating the AccountLocator

Component

Page 16: Lightning Components Workshop v2

Anatomy of a Lightning Component

<aura:component controller="AccountController">

<div>

<div>AccountMap goes here</div>

<div>AccountList goes here</div>

</div>

</aura:component>

Page 17: Lightning Components Workshop v2

Component Parts: Component

UI MarkupData bindingAttributes

Component

Page 18: Lightning Components Workshop v2

Component Parts: Style

UI MarkupData bindingAttributes

ComponentStyle

EncapsulatedCSS

Page 19: Lightning Components Workshop v2

1. In Lightning Applications2. In the Salesforce1 app3. In App Builder

Where can I use Lightning Components?

Page 20: Lightning Components Workshop v2

Using a Lightning Component in a Lightning App

1. Create a Lightning AppFile > New > Lightning Application

2. Embed the Lightning Component<aura:application>

<c:AccountLocator/>

</aura:application>

Useful for creating fullscreen apps or for testing components during development

Page 21: Lightning Components Workshop v2

Using a Lightning Component in the Salesforce1 App

1. Implement the force:appHostable interface<aura:component implements="force:appHostable">

2. Create a Tab3. Add the Tab to Mobile Navigation

Page 22: Lightning Components Workshop v2

1. Create the AccountLocator component2. Add AccountLocator to the Salesforce1 App menu

Challenge

Page 23: Lightning Components Workshop v2

Step 5:Creating the AccountList

Component

Page 24: Lightning Components Workshop v2

Attributes

• The data of the component• Available anywhere in the component• Examples:

<aura:attribute name="price" type="Number"/>

<aura:attribute name="title" type="String"/>

<aura:attribute name="account" type="Account"/><aura:attribute name="accounts" type="Account[]"/>

Page 25: Lightning Components Workshop v2

Data Binding {! }

<aura:attribute name="account" type="Account"/>

<p>{!v.account.Name}</p>

Initial value of <p> is set to the value of account.Name Value of <p> automatically updated when value of account.Name changes

Page 26: Lightning Components Workshop v2

Bidirectional Data Binding

<aura:attribute name="price" value="100" type="Number"/>

<ui:inputNumber label="Principal:" value="{!v.price}"/>

Initial value of inputNumber is set to value of attribute (100) Value of price attribute is updated when user types new value in inputNumber

Page 27: Lightning Components Workshop v2

Component Parts: Controller

UI MarkupData bindingAttributes

Component

EventHandlers

ControllerStyle

EncapsulatedCSS

Page 28: Lightning Components Workshop v2

<aura:attribute name="counter" type="Number" default="0"/><ui:button label="Click me" press="{!c.handleClick}"/><div>{!v.counter}</div>

handleClick: function(component, event) { var counter = component.get("v.counter"); counter = counter + 1; component.set("v.counter", counter);}

Com

pone

ntCo

ntro

ller

Event Handler ExampleCounter

Page 29: Lightning Components Workshop v2

Event Handler ExampleRetrieving Data on Init

<aura:attribute name="accounts" type="Accounts[]"/><aura:handler name="init" value="{!this}" action="{!c.doInit}" />

doInit : function(component, event) { var action = component.get("c.findAll"); action.setCallback(this, function(a) { component.set("v.accounts", a.getReturnValue()); }); $A.enqueueAction(action);}

Com

pone

ntCo

ntro

ller

Page 30: Lightning Components Workshop v2

Iterating through a List

<aura:attribute name="accounts" type="Account[]"/>

<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>

<ul>

<aura:iteration items="{!v.accounts}" var="account">

<li>{!account.Name}</li>

</aura:iteration>

</ul>

Page 31: Lightning Components Workshop v2

Nested Component

• A component used in another component• AccountListItem Example:<aura:component>

<aura:attribute name="account" type="Account"/>

<li>{!v.account.Name}</li>

</aura:component>

Page 32: Lightning Components Workshop v2

Using a Nested Component

<aura:attribute name="accounts" type="Account[]"/>

<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>

<ul>

<aura:iteration items="{!v.accounts}" var="account">

<c:AccountListItem account="{!account}"/>

</aura:iteration>

</ul>

Page 33: Lightning Components Workshop v2

1. Create the AccountList component responsible for displaying the list of accounts

2. Create the AccountListItem component that you nest inside AccountList to render individual accounts in the list

Challenge

Page 34: Lightning Components Workshop v2

Step 6:Creating the AccountMap Component

Page 35: Lightning Components Workshop v2

• External JavaScript libraries and CSS style sheets must be loaded as static resources

• Use the <ltng:require> tag to load them• Loading is asynchronous• afterScriptLoaded event is triggered after files have been succesfully

loaded

Loading External JavaScript Libraries and CSS Files

Page 36: Lightning Components Workshop v2

Loading External JavaScript Libraries

<ltng:require scripts="/resource/leaflet/leaflet.js"/>

Page 37: Lightning Components Workshop v2

Loading External CSS Style Sheets

<ltng:require styles="/resource/leaflet/leaflet.css" />

Page 38: Lightning Components Workshop v2

Loading JavaScript Libraries and CSS Style Sheets

<ltng:require scripts="/resource/leaflet/leaflet.js"

styles="/resource/leaflet/leaflet.css" />

Page 39: Lightning Components Workshop v2

Using the afterScriptLoaded Event

<ltng:require scripts="/resource/leaflet/leaflet.js" styles="/resource/leaflet/leaflet.css" afterScriptsLoaded="{!c.renderMap}" />

Page 40: Lightning Components Workshop v2

1. Load leaflet JS library2. Load Leaflet CSS3. Render the map when files are loaded

Challenge

Page 41: Lightning Components Workshop v2

Step 7:Intercomponent Communication

Page 42: Lightning Components Workshop v2

Intercomponent Communication

Application Event Broker

Event Object

<aura:handler event="c:AccountsLoaded" action="{!c.accountsLoadedHandler}"/>

<aura:registerEvent name="loaded" type="c:AccountsLoaded"/>

var event = $A.get("e.c:AccountsLoaded");event.setParams({"accounts": accounts});event.fire();

AccountMapAccountList

Page 43: Lightning Components Workshop v2

Creating the AccountsLoaded Event

<aura:event type="APPLICATION">

<aura:attribute name="accounts" Type="Account[]"/>

</aura:event>

Page 44: Lightning Components Workshop v2

1. Create the AccountsLoaded Event2. Trigger the AccountsLoaded Event in AccountList3. Handle the AccountsLoaded Event in AccountMap

Challenge

Page 45: Lightning Components Workshop v2

Step 8:Using Events to Center the Map

Page 46: Lightning Components Workshop v2

Intercomponent Communication

Application Event Broker

Event Object

<aura:handler event="c:AccountSelected" action="{!c.accountSelectedHandler}"/>

<aura:registerEvent name="select" type="c:AccountSelected"/>

var event = $A.get("e.c:AccountSelected");event.setParams({"account": account});event.fire();

AccountMapAccountList

Page 47: Lightning Components Workshop v2

1. Create the AccountSelected event2. Trigger the AccountSelected event in AccountList3. Handle the AccountSelected event in AccountMap and center the

map on the selected account location

Challenge

Page 48: Lightning Components Workshop v2

Step 9:Interacting with the Salesforce1 App

Page 49: Lightning Components Workshop v2

1. Lightning Components enable you to extend standard features2. Don't reinvent the wheel

For example, if your component needs an account details view: use the standard one, don't create your own

3. Navigation between standard features and custom components should be smooth and feel integrated: users shouldn't notice they are switching between standard and custom features

4. Platform events allow you to integrate your custom components into the standard experience

Salesforce1 Integration

Page 50: Lightning Components Workshop v2

Firing a Platform Event

var event = $A.get("e.force:navigateToSObject");

event.setParams({

"recordId": accountId

});

event.fire();

This event will be handled be the Salesforce1 app which will then navigate to the account's details view

Page 51: Lightning Components Workshop v2

Component Parts: Helper

UI MarkupData bindingAttributes

Component

EventHandlers

Controller

SharedLogic

HelperStyle

EncapsulatedCSS

Page 52: Lightning Components Workshop v2

When a user clicks a marker on the map, load the default Salesforce1 details view for the selected account

Challenge

Page 53: Lightning Components Workshop v2

Step 10:Using Components in App Builder

Page 54: Lightning Components Workshop v2

Using a Lightning Component in App Builder

1.Implement the flexipage:availableForAllPageTypes interface

<aura:component implements="flexipage:availableForAllPageTypes">

2.Create a component description in the Design part

<design:component label="AccountList">

</design:component>

3.Enable App Builder for Lightning Experience (PILOT)

4.Drag the component from the component palette in App Builder

Page 55: Lightning Components Workshop v2

Compose AccountList and AccountMap in App Builder

Challenge

Page 56: Lightning Components Workshop v2

Summary

UI MarkupData bindingAttributes

Component

Design Descriptor

EventHandlers

Controller

SharedLogic

HelperStyle

Custom Rendering

Renderer

EncapsulatedCSS

App Builder

Page 57: Lightning Components Workshop v2