salesforce lightning零基礎學習(三) 表達式的!(綁定表達式)與 #(非綁定表達式)

在salesforce的classic中,我們使用{!expresion}在前臺頁面展示信息,在lightning中,上一篇我們也提及了,如果展示attribute的值,可以使用{!v.expresion}展示信息。

lightning在component中解析動態值的時候,會將{!} 這個里面的變量進行動態的解析以及展示。當然這個變量可以是基礎類型,自定義類型,數組集合等等,當然如果表達式為空字符串或者是空格則不會解析。偶爾特殊的要求為需要輸出‘{!}’這個字符串,官方文檔說可以使用<aura:text/>進行展示,因為這個標簽不會將‘{!’作為頭進行解析。當然,不要被這句話所欺騙,正常的理解應該為當value的值非tag或者attribute值的情況下,才會被解析成平滑的字符串。這里做個demo看一下渲染效果:

 1 <aura:component>
 2     <aura:attribute name="test" type="String" default="testValue"/>
 3     {!v.test}
 4     <br/>
 5     <aura:text value="{!v.test}"/>
 6     <br/>
 7     {!}
 8     <br/>
 9     <aura:text value="{!}"/>
10     <br/>
11     <aura:text value="{!v.test2}"/>
12     <br/>
13     <aura:text value="{!test2}"/>
14 </aura:component>

demo中分了幾種情況:輸出正常的attribute值、通過aura:text輸出attribute值、輸出{!}值、輸出一個不存在的屬性的值、輸出一個不存在的變量的值。結果展示如下圖所示。

通過結果我們可以看出來,aura:text并不是不解析{!開頭的內容,而是如果{!}不包含任何表達式情況下,會默認作為文本進行輸出,其實不是用aura:text 直接輸出{!}也可以作為文本進行輸出。如果解析的內容不存在情況下,則默認返回null。

使用{!}方式標簽僅能用于在.cmp 以及.app文件中,即只能用在lightning component以及lightning application中。

表達式除了簡單的通過{!v.attribute} 展示attribute的內容或者{!123}等展示字面內容的內容外,還可以使用條件表達式這種方式展示內容,通常有兩種常用的方式:三目運算和使用<aura:if>。

三目運算:下面的代碼為當attribute xxx的值為xxx的情況下,這個classs設置為'xxx',否則,class為空。

<a class="{!v.xxx == 'xxx' ? 'xxx' : ''}" >test </a>

?<aura:if>:此標簽通常和aura:set一起用。當aura:if判斷部分為true,顯示aura:if為true的邏輯,否則使用aura:set設置attribute為else,走false的邏輯。下面的例子為如果有edit權限則展示Edit的Button,否則展示'You can't edit this'的文字。

1 <aura:attribute name="edit" type="Boolean" default="true"/>
2 <aura:if isTrue="{!v.edit}">
3     <ui:button label="Edit"/>
4     <aura:set attribute="else">
5        You can’t edit this.
6     </aura:set>
7 </aura:if>

?我們在項目中會經常用到lightning component中嵌套其他的子的lightning component情況,比如列表中包含<aura:iterator> 標簽嵌套item的lightning component從而實現一個自定義列表展示。

嵌套lightning component就會涉及到attribute 賦值的部分,針對attribute賦值,可以賦值一個寫死的值,比如賦值‘123’等。lightning也提供了兩種動態方式賦值:{!attributeValue}以及{#attributeValue}。兩者賦值區別還是很大的,具體如下:

一.? ?!方式:此種方式又可以理解為綁定的表達式,即對attribute的賦值非一次性的,改變會貫穿著始終。子項如果修改了這個attribute的賦值,也會影響到父中此attribute的值;同樣的,如果父中對此attribute有更改,也會作用到子component中的引用上。

這里做一個例子:

1.boundSonComponent.cmp:聲明一個attribute名稱為sonAttribute,使用一個aura:text展示這個值,點擊按鈕后更新這個sonAttribute的value。

<aura:component><aura:attribute type="String" name="sonAttribute"/>son attribute : <aura:text value="{!v.sonAttribute}"/><br/><lightning:button onclick="{!c.handleSonClick}" label="son button"/>
</aura:component>

2.boundSonComponentController.js : 更新sonAttribute的value。

({handleSonClick : function(component, event, helper) {var sonAttributeValue = 'Updated Son Attribute';component.set('v.sonAttribute', sonAttributeValue);}
})

3.boundParentComponent.cmp :聲明一個attribute名稱為parentAttribute,展示此attribute的值并且提供按鈕可以修改值,在這個基礎上引入了一個boundSonComponent,并且將parentAttribute的值傳給了sonAttribute。注意,這里通過‘!’方式進行傳遞值。

<aura:component><aura:attribute name="parentAttribute" type="String" default="parentAttributeValue"/>parentAttribute : <aura:text value="{!v.parentAttribute}"/><br/><lightning:button label="parent button" onclick="{!c.handleParentClick}" /><br/><c:boundSonComponent sonAttribute = '{!v.parentAttribute}'/>
</aura:component>

4.boundParentComponentController.js :更新parentAttribute的value。

({handleParentClick : function(component, event, helper) {component.set('v.parentAttribute', 'updated parent attribute');}
})

?因為lightning無法直接運行lightning:component,所以需要將lightning:component放在 lightning app builder視圖中或者放在Lightning application中,lightning app builder 可以重新定義 page layout,分為App Page, Home Page 和Record Page。這個和page layout 很像,需要注意的一點為顯示在不同類型的頁面需要實現不同的接口,具體可以查看上一篇內容,感興趣的可以自己玩一玩。

demo以創建Lightning application為主。

5.創建boundApplication.app 用來包含boundParentComponent從而展示。

<aura:application><c:boundParentComponent/>
</aura:application>

運行lightning application可以通過developer console -> File -> Opening Lighting Resource 找到此bundle,然后Open Selected,打開后點擊Preview便可以看到顯示方式。

結果展示:

1.默認進來情況:因為parentAttribute的值作為了sonAttribute的值,所以二者顯示相同的值。

?

?

?2.點擊 parent button:點擊parent button后,后臺會更新parentAttribute的value。由于sonAttribute傳遞的值通過parentAttribute值傳遞,并且是通過!(bound)方式,所以當更改了parentAttribute后,sonAttribute也同樣的改變成了parentAttribute的值。

?

?3. 點擊son button:點擊son button后,后臺會更新sonAttribute的值。由于sonAttribute是通過parentAttribute值傳遞,并且是通過!(bound)方式,所以當更改了sonAttribute后,parentAttribute也同樣的受到了改變。

?這種操作結果可能讓人感到意外,因為我們有的時候只是想將attribute的值作為一個一次性初始化的值傳遞給子的component 的attribute,針對父或者針對子的改動并不希望后期在影響當前component外的其他的父或者子的component attribute。接下來的方式即可以做到非綁定表達式,即使用 # 方式進行值的傳遞。

二.? ?# 方式:可以理解成非綁定的表達式,即有嵌套的lightning component,父對子傳值僅初始化有效,后期父對這個attribute value的變化不會影響到子,同樣子對這個attribute value的變化同樣不會影響到父。

?在這里重用boundSonComponent,新建unboundParentComponent,使用#方式傳遞值。

1.unboundParentComponent:和boundParentComponent唯一的區別為在對boundSonComponent傳值的時候,將! 修改成了 # .?

<aura:component><aura:attribute name="parentAttribute" type="String" default="parentAttributeValue"/>parentAttribute : <aura:text value="{!v.parentAttribute}"/><br/><lightning:button label="parent button" onclick="{!c.handleParentClick}" /><br/><c:boundSonComponent sonAttribute = '{#v.parentAttribute}'/>
</aura:component>

結果展示:

1.當點擊parent button時,僅更改了parentAttribute的值,sonAttribute值不會受到影響。

2.當點擊son button時,金更改了sonAttribute的值,parentAttribute的值同樣不會受到影響。


上一篇我們有簡單的提到過lightning 提供了一些標準的事件,比如init,change。這里我們對change事件進行一個思考。如果aura:handler針對sonAttribute綁定了一個change事件,使用! 和使用# 是否會有上述的影響。

我們在boundSonComponent以及boundParentComponent添加一下change handler內容。監聽一下使用!情況下屬性值改變造成的change的影響。
1.boundSonComponent.cmp

<aura:component><aura:attribute type="String" name="sonAttribute"/><aura:handler name="change"  value="{!v.sonAttribute}" action="{!c.onSonAttributeChange}"/>son attribute : <aura:text value="{!v.sonAttribute}"/><br/><lightning:button onclick="{!c.handleSonClick}" label="son button"/>
</aura:component>

2.boundSonComponentController.js

({handleSonClick : function(component, event, helper) {var sonAttributeValue = 'Updated Son Attribute';component.set('v.sonAttribute', sonAttributeValue);},onSonAttributeChange : function(component,event,helper) {console.log("son attribute has changed");console.log("old value: " + event.getParam("oldValue"));console.log("current value: " + event.getParam("value"));}
})

boundParentComponent改動和上述內容相似,都是在component中添加了aura:handler聲明,后臺添加了函數輸出內容。

結果展示:

1.先點擊son Button,通過輸出結果可以看到,先執行了son Attribute的更新,因為采用的是!(綁定表達式方式),所以更新了parentAttribute的更新事件,當更新了parentAttribute后,又重新執行了一下子的component中的事件更新。

2.點擊parent button,更新了屬性值以后先執行了parentAttribute change的事件,然后又執行了他的子component的事件。

使用#方式就不會級聯的對事件進行調用,只會調用到自己的那層change事件。這里就不做實驗。

總結: 通過上述的兩個例子的展示結果可以看出來:對子component的attribute進行動態賦值時, !(綁定表達式) 與 #(非綁定表達式)差距還是很大的。使用!方式關系貫穿始終,無論父還是子對attribute改動都會對其關聯的受到影響,而且使用change handler也會有綁定關系,貫穿始終。使用#方式僅在初始化時有效,后期針對引用的attribute的值進行任何修改,都不會同步修改引用的地方。具體使用哪種方式看項目中用到的場景,同步操作則使用!方式傳值;僅需要其傳值作為初始化,后期改動無關則選擇#方式傳值。篇中有錯誤地方歡迎指出,有問題歡迎留言。



?

轉載于:https://www.cnblogs.com/zero-zyq/p/8947726.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250386.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sqlserver學習3---sql函數

一、SQL DML 和 DDL 可以把 SQL 分為兩個部分&#xff1a;數據操作語言 (DML) 和 數據定義語言 (DDL)。 SQL (結構化查詢語言)是用于執行查詢的語法。但是 SQL 語言也包含用于更新、插入和刪除記錄的語法。 查詢和更新指令構成了 SQL 的 DML 部分&#xff1a; SELECT - 從數據庫…

JavaScript --- [學習筆記] 原型模式

說明 接JavaScript — > [學習筆記]觀察者模式 & 理解對象 & 工廠模式 & 構造函數模式上一篇構造函數模式創建的實例,不同實例的同一個方法是不相等的,為了解決這個問題.出現了原型模式 1. 原型模式 具體做法是,不在構造函數中定義對象實例的信息,而是將這些…

網絡協議各層概述

網絡協議概述 OSI是一個開放性的通信系統互連參考模型&#xff0c;他是一個定義得非常好的協議規范。OSI模型有7層結構&#xff0c;每層都可以有幾個子層。 OSI的7層從上到下分別是 7 應用層 6 表示層 5 會話層 4 傳輸層 3 網絡層 2 數據鏈路層 1 物理層&#xff1b; 其中高層&…

A start job is running for Raise network interface(5min 13s )問題解決方法

命令&#xff1a;sudo vim /etc/systemd/system/network-online.target.wants/networking.service將里面的TimeoutStartSec5min 修改為TimeoutStartSec2sec 然后重啟系統&#xff0c;就可以生效了&#xff0c;開機速度很快 轉載于:https://www.cnblogs.com/sea-stream/p/98615…

javascript --- 實現對象的深拷貝

淺拷貝和深拷貝 淺拷貝: 只拷貝一層.當對象是復雜數據類型(Object、 Array)時,只拷貝引用深拷貝: 多層拷貝.復雜數據類型,會重新分配內存空間. 實現淺拷貝的2種方法 使用for ... in 實現 var obj {name: marron,age: 18,msg: {sex: "1" } } var o {}; for(let …

Qt與FFmpeg聯合開發指南(二)——解碼(2):封裝和界面設計

與解碼相關的主要代碼在上一篇博客中已經做了介紹&#xff0c;本篇我們會先討論一下如何控制解碼速度再提供一個我個人的封裝思路。最后回歸到界面設計環節重點看一下如何保證播放器界面在縮放和拖動的過程中保證視頻畫面的寬高比例。 一、解碼速度 播放器播放媒體文件的時候播…

Bzoj1051 受歡迎的牛

每一頭牛的愿望就是變成一頭最受歡迎的牛。現在有 N 頭牛&#xff0c;給你 M 對整數 (A,B)&#xff0c;表示牛 A 認為牛 B 受歡迎。這種關系是具有傳遞性的&#xff0c;如果 A 認為 B 受歡迎&#xff0c;B 認為 C 受歡迎&#xff0c;那么牛 A 也認為牛 C 受歡迎。你的任務是求出…

node --- 模塊加載機制

1. Node.js中模塊加載機制 1.1 模塊查找規則-當模塊擁有路徑但沒有后綴時 require(./find.js); require(./find);require方法根據模塊路徑查找模塊,如果是完整路徑,直接進入模塊如果模塊后綴省略,先找同名JS文件再找同名JS文件夾 require(./find); // 以上會先找到命令行目錄…

51Nod 蜥蜴和地下室(搜索)

哈利喜歡玩角色扮演的電腦游戲《蜥蜴和地下室》。此時&#xff0c;他正在扮演一個魔術師。在最后一關&#xff0c;他必須和一排的弓箭手戰斗。他唯一能消滅他們的辦法是一個火球咒語。如果哈利用他的火球咒語攻擊第i個弓箭手&#xff08;他們從左到右標記&#xff09;&#xff…

多線程——實現Runnable接口實現一個多線程

實現Runnable接口實現一個多線程 Runnable接口源碼&#xff1a; package java.lang; //Runnable接口源碼只有一個run方法 public interface Runnable {public abstract void run(); } 實現Runnable的兩個多線程類&#xff1a; public class RunnableThread1 implements Runnabl…

javascript --- 文件上傳即時預覽 閉包實現多圖片即時預覽

使用javascript原生功能實現,點擊上傳文件,然后再網頁上顯示出來 1. 初級顯示 1.1 準備一個input標簽和一個img標簽 <input typefile id"file"> <img id"preview" src"">1.2 js代碼如下 // 將上傳的圖片顯示到頁面上function sho…

第一次作業:深入Linux源碼分析進程模型

一.進程的概念 第一&#xff0c;進程是一個實體。每一個進程都有它自己的地址空間&#xff0c;一般情況下&#xff0c;包括文本區域&#xff08;text region&#xff09;、數據區域&#xff08;data region&#xff09;和堆棧&#xff08;stack region&#xff09;。文本區域存…

關于模型驗證那點事兒

今天應笑笑老師之問&#xff0c;做了一個模型驗證的例子&#xff0c;發現之前對這個東西的理解太片面&#xff0c;重新整理了一下思路 字段驗證優先級高于類驗證 什么是類驗證呢&#xff1f;就是兩個字段組合的驗證&#xff0c;比如你Admin不允許修改密碼&#xff0c;你修改密碼…

mongoose --- createUser

說明 源代碼記錄、遺忘回顧mongoDB默認不需要使用賬號密碼即可訪問數據庫.下面是給mongoDB添加超級管理員和普通用戶的方法 以系統管理員的方式運行powershell連接數據庫 mongo查看數據庫: show dbs切換到admin數據庫: use admin創建超級管理員賬戶: db.createUser({user: roo…

Win10安裝MySQL5.7.22 解壓縮版(手動配置)方法

1.下載地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html#downloads 直接點擊下載項 下載后&#xff1a; 2.可以把解壓的內容隨便放到一個目錄&#xff0c;我的是如下目錄&#xff08;放到C盤的話&#xff0c;可能在修改ini文件時涉及權限問題&#xff0c;之后我…

Elemant-UI日期范圍的表單驗證

Form 組件提供了表單驗證的功能&#xff0c;只需要通過 rules 屬性傳入約定的驗證規則&#xff0c;并將 Form-Item 的 prop 屬性設置為需校驗的字段名即可。但是官網的示例只有普通日期類型的驗證&#xff0c;沒有時間范圍的驗證。 一開始&#xff0c;我認為時間時間范圍的是一…

node --- [express項目] 開發環境下使用morgan控制臺輸出訪問信息

說明 源代碼記錄、遺忘回顧 process.env node中提供了一個process.env接口用于訪問計算機中的系統環境變量. 可以利用以上屬性來區分當前的環境是開發環境還是生產環境,代碼如下: if (process.env.NODE_ENV development) {console.log(當前環境是開發環境) } else {consol…

Dynamics CRM 訪問團隊的使用

訪問團隊和負責人團隊的區別是&#xff1a;負責人團隊可以擁有記錄&#xff0c;訪問團隊不能擁有記錄也不能加入解決方案中。 訪問團隊用法1&#xff1a;可以將不同組織的人員加入到訪問組實現數據的更新、刪除、共享 訪問團隊用法2&#xff1a;訪問團隊模板的使用 步驟一&…

業務邏輯

快捷支付接口規范 問題背景 持卡人身份驗證持卡人在發卡銀行提供的身份驗證服務器進行驗證&#xff0c;將結果告知商戶資金清算資金清算在身份驗證通過后進行即時清算&#xff0c;也可能是通過專用資金清算網絡進行傳統方法弊端 持卡人需要訪問很多網站才能完成一次完整支付 &a…

node --- [express] cookie/session 機制與 中間件的使用(路由守衛)

說明 源代碼記憶、遺忘回顧使用 cookie/session 機制,讓 客戶端/服務器 的訪問變得有狀態 cookie 與 session 由于 HTTP 協議的無狀態性,當一次連接斷開后. 服務器并不會記錄用戶是否登錄. 因此需要引入 cookie/session 機制 cookie cookie: 瀏覽器在電腦硬盤中開辟的一塊空…