underscore template()函數(shù)說明:
該函數(shù)包含三種模板:
(1)<% %>:包含邏輯代碼,渲染后不會展現(xiàn)。
(2)<%= %>:數(shù)據(jù)類型,渲染后展示數(shù)據(jù)。
(3)<%- %>:將HTML標(biāo)記轉(zhuǎn)換為常用字符串,以避免代碼攻擊。
調(diào)用格式:
沒有實現(xiàn)雙向數(shù)據(jù)綁定。
1、Underscore對象封裝
Underscore并沒有在原生的JavaScript對象原型中進(jìn)行擴(kuò)展,而是像jQuery一樣,將數(shù)據(jù)封裝在一個自定義對象中(下文中稱“Underscore對象”)。
你可以通過調(diào)用一個Underscore對象的value()方法來獲取原生的JavaScript數(shù)據(jù),例如:
2、優(yōu)先調(diào)用JavaScript 1.6內(nèi)置方法
Underscore中有許多方法在JavaScript1.6中已經(jīng)被納入規(guī)范,因此在Underscore對象內(nèi)部,會優(yōu)先調(diào)用宿主環(huán)境提供的內(nèi)置方法(如果宿主環(huán)境已經(jīng)實現(xiàn)了這些方法),以此提高函數(shù)的執(zhí)行效率。
而對于不支持JavaScript 1.6的宿主環(huán)境,Underscore會通過自己的方式實現(xiàn),而對開發(fā)者來說,這些完全是透明的。
這里所說的宿主環(huán)境,可能是Node.js運(yùn)行環(huán)境,或客戶端瀏覽器。
3、改變命名空間
Underscore默認(rèn)使用_(下劃線)來訪問和創(chuàng)建對象,但這個名字可能不符合我們的命名規(guī)范,或容易引起命名沖突。
我們可以通過noConflict()方法來改變Underscore的命名,并恢復(fù)_(下劃線)變量之前的值,例如:
4、鏈?zhǔn)讲僮?br /> 還記得我們在jQuery中是如何進(jìn)行鏈接操作嗎?例如:
Underscore同樣支持鏈?zhǔn)讲僮?,但你需要先調(diào)用chain()方法進(jìn)行聲明:
如果調(diào)用了chain()方法,Underscore會將所調(diào)用的方法封裝在一個閉包內(nèi),并將返回值封裝為一個Underscore對象并返回:
5、擴(kuò)展Underscore
我們可以通過mixin()方法輕松地向Underscore中擴(kuò)展自定義方法,例如:
這些方法被追加到Underscore的原型對象中,所有創(chuàng)建的Underscore對象都可以使用這些方法,它們享有和其它方法同樣的環(huán)境。
6、遍歷集合
each()和map()方法是最常用用到的兩個方法,它們用于迭代一個集合(數(shù)組或?qū)ο螅?,并依次處理集合中的每一個元素,例如:
map()方法與each()方法的作用、參數(shù)相同,但它會將每次迭代函數(shù)返回的結(jié)果記錄到一個新的數(shù)組并返回。
7、函數(shù)節(jié)流
函數(shù)節(jié)流是指控制一個函數(shù)的執(zhí)行頻率或間隔(就像控制水流的閘門一樣),Underscore提供了debounce()和throttle()兩個方法用于函數(shù)節(jié)流。
為了更清楚地描述這兩個方法,假設(shè)我們需要實現(xiàn)兩個需求:
需求1:當(dāng)用戶在文本框輸入搜索條件時,自動查詢匹配的關(guān)鍵字并提示給用戶(就像在Tmall輸入搜索關(guān)鍵字時那樣)
首先分析第1個需求,我們可以綁定文本框的keypress事件,當(dāng)輸入框內(nèi)容發(fā)生變化時,查詢匹配關(guān)鍵字并展示。假設(shè)我想查詢“windows phone”,它包含13個字符,而我輸入完成只花了1秒鐘(好像有點快,就意思意思吧),那么在這1秒內(nèi),調(diào)用了13次查詢方法。這是一件非??植赖氖虑?,如果Tmall也這樣實現(xiàn),我擔(dān)心它會不會在光棍節(jié)到來之前就掛掉了(當(dāng)然,它并沒有這么脆弱,但這絕對不是最好的方案)
更好的方法是,我們希望用戶已經(jīng)輸入完成,或者正在等待提示(也許他懶得再輸入后面的內(nèi)容)的時候,再查詢匹配關(guān)鍵字。
最后我們發(fā)現(xiàn),在我們期望的這兩種情況下,用戶會暫時停止輸入,于是我們決定在用戶暫停輸入200毫秒后再進(jìn)行查詢(如果用戶在不斷地輸入內(nèi)容,那么我們認(rèn)為他可能很明確自己想要的關(guān)鍵字,所以等一等再提示他)
這時,利用Underscore中的debounce()函數(shù),我們可以輕松實現(xiàn)這個需求:
在本例中,我們將模板內(nèi)容和需要填充的數(shù)據(jù)傳遞給template方法,它會按以下順序進(jìn)行處理:
(1)將模板內(nèi)容解析為可執(zhí)行的JavaScript(解析模板標(biāo)簽)
(2)通過with語句將解析后的JavaScript作用域修改為我們傳遞的數(shù)據(jù)對象,這使我們能夠直接在模板中通過變量形式訪問數(shù)據(jù)對象的屬性
(3)執(zhí)行解析后的JavaScript(將數(shù)據(jù)填充到模板)
(4)返回執(zhí)行后的結(jié)果
我們經(jīng)常會遇到一種情況:多次調(diào)用template方法將數(shù)據(jù)渲染到同一個模板。
假設(shè)我們有一個分頁列表,列表中的每一條數(shù)據(jù)都通過模板渲染,當(dāng)用戶進(jìn)入下一頁,我們會獲取下一頁的數(shù)據(jù)并重新渲染,實際上每次渲染的模板都是同一個,但剛才描述的template所有處理過程總會被執(zhí)行。
其實Underscore的template方法提供了一種更高效的調(diào)用方式,我們將上面代碼中的最后兩句修改為:
你會發(fā)現(xiàn)細(xì)微的差別:我們在調(diào)用template方法時只傳遞了模板內(nèi)容,而沒有傳遞數(shù)據(jù),此時template方法會解析模板內(nèi)容,生成解析后的可執(zhí)行JavaScript代碼,并返回一個函數(shù),而函數(shù)體就是解析后的JavaScript,因此當(dāng)我們調(diào)用該函數(shù)渲染數(shù)據(jù)時,就省去了模板解析的動作。
你應(yīng)該將返回的函數(shù)存儲起來(就像我將它存儲在render變量中一樣),再通過調(diào)用該函數(shù)來渲染數(shù)據(jù),特別是在同一個模板可能會被多次渲染的情況下,這樣做能提高執(zhí)行效率(具體提升多少,應(yīng)該根據(jù)你的模板長度和復(fù)雜度而定,但無論如何,這都是一個良好的習(xí)慣)。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com