Avalon中文長(zhǎng)字符截取、關(guān)鍵字符隱藏、自定義過(guò)濾器
關(guān)于AvalonJS
avalon是一個(gè)簡(jiǎn)單易用迷你的MVVM框架,它最早發(fā)布于2012.09.15,為解決同一業(yè)務(wù)邏輯存在各種視圖呈現(xiàn)而開發(fā)出來(lái)的。 事實(shí)上,這問(wèn)題其實(shí)也可以簡(jiǎn)單地利用一般的前端模板加jQuery 事件委托 搞定,但隨著業(yè)務(wù)的膨脹, 代碼就充滿了各種選擇器與事件回調(diào),難以維護(hù)。因此徹底的將業(yè)務(wù)與邏輯分離,就只能求助于架構(gòu)。 最初想到的是MVC,嘗試過(guò)backbone,但代碼不降反升,很偶爾的機(jī)會(huì),碰上微軟的WPF, 優(yōu)雅的MVVM架構(gòu)立即吸引住我,我覺(jué)得這就是我一直追求的解決之道。
MVVM將所有前端代碼徹底分成兩部分,視圖的處理通過(guò)綁定實(shí)現(xiàn)(angular有個(gè)更炫酷的名詞叫指令), 業(yè)務(wù)邏輯則集中在一個(gè)個(gè)叫VM的對(duì)象中處理。我們只要操作VM的數(shù)據(jù),它就自然而然地神奇地同步到視圖。 顯然所有神秘都有其內(nèi)幕,C#是通過(guò)一種叫訪問(wèn)器屬性的語(yǔ)句實(shí)現(xiàn),那么JS也有沒(méi)有對(duì)應(yīng)的東西。 感謝上帝,IE8最早引入這東西(Object.defineProperty),可惜有BUG,但帶動(dòng)了其他瀏覽器實(shí)現(xiàn)它,IE9+便能安全使用它。 對(duì)于老式IE,我找了好久,實(shí)在沒(méi)有辦法,使用VBScript實(shí)現(xiàn)了。
Object.defineProperty或VBS的作用是將對(duì)象的某一個(gè)屬性,轉(zhuǎn)換一個(gè)setter與getter, 我們只要劫持這兩個(gè)方法,通過(guò)Pub/Sub模式就能偷偷操作視圖。為了紀(jì)念WPF的指引,我將此項(xiàng)目以WPF最初的開發(fā)代號(hào)avalon來(lái)命名。 它真的能讓前端人員脫離DOM的苦海,來(lái)到數(shù)據(jù)的樂(lè)園中!
題外話:
最近接手一個(gè)項(xiàng)目,前端采用avalon這個(gè)mvvm框架,對(duì)于先前接觸過(guò)angularjs的人來(lái)說(shuō),總感覺(jué)avalon還是“太”輕量了(非褒義)
網(wǎng)上為avalon背書的無(wú)外乎是說(shuō):國(guó)產(chǎn),體積小,逃離dom操作,上手難度低,兼容ie6;劣勢(shì)是:“然而avalon也有自己的劣勢(shì)——知名度較低”,呃,我想靜靜.....
吐槽jquery過(guò)渡依賴選擇器,繁雜的dom操作,可是avalon的ajax和動(dòng)畫效果還得指望其他控件,實(shí)際上往往卻又是和jquery搭配使用,吐槽jquery,卻又離不開jquery,真是悲劇... 說(shuō)angular非常難上手,ng上手難度低好不,ng生態(tài)好,功能強(qiáng)大,文檔和翻譯齊全,社區(qū)成熟活躍,官方插件第三方插件一大堆。
性能問(wèn)題,為了平衡開發(fā)效率和性能,這只是一種選擇問(wèn)題。用過(guò)ng的人,也不會(huì)擔(dān)心什么性能問(wèn)題吐槽angular版本兼容性。可Avalon還是出現(xiàn)這樣的聲明:“注意 : 以上三個(gè)分支都比較穩(wěn)定, 但互相不太兼容。 建議直接用2.0?!?/p>
以上只是吐槽那些文案背書,avalon也算一個(gè)不錯(cuò)的框架,也一直在優(yōu)化改進(jìn)和吸收那些知名MVVM框架的優(yōu)點(diǎn),比如2.0版本,就新增了4個(gè)數(shù)組的過(guò)濾器,指令也進(jìn)入了to do list。
希望哪天用過(guò)angular的人再來(lái)用avalon后都會(huì)說(shuō):哎喲,不錯(cuò)哦!
分享兩個(gè)非常簡(jiǎn)單的過(guò)濾器:隱藏關(guān)鍵字符和字符截短。同樣也可以遷移到ng。后期還有不錯(cuò)的過(guò)濾器,還往這里面加
keyword:avalon,自定義,過(guò)濾器,中文,長(zhǎng)字符,截短,截?cái)?truncate,隱藏字符,angular
隱藏關(guān)鍵字符
可能需要在前端某些頁(yè)面上隱藏一些關(guān)鍵信息(如果真正要隱藏,還是需要后端來(lái)處理),那么可以用到:
/** * 隱藏字符串中關(guān)鍵code ,隱藏字符默認(rèn)為'*' * 例如隱藏手機(jī)號(hào),卡號(hào):1890000000 - 189****0000; {{str|hide_code(3,4,'*')}} * @param str * @param pos 開始位置 * @param length 替換字符個(gè)數(shù) * @param newChar 替換的字符/字符串 * @returns {*} */ avalon.filters.hide_code = function (str, pos, length, newChar) { pos = pos || 0; length = length || 0; newChar = newChar || '*'; if (pos < 0 || length <= 0 || pos + length > str.length) { return str; } var repStr = ""; for (var i = 0; i < length; i++) { repStr += newChar; } return str.slice(0, pos) + repStr + str.slice(pos + length, str.length); }
長(zhǎng)字符截短(按字符截取,中文占兩字符-改進(jìn)版)
原avalon的truncate過(guò)濾器,是按照中文英文均占一個(gè)字符來(lái)截取。該過(guò)濾器改進(jìn)為中文占兩個(gè)字符英文一個(gè)字符來(lái)進(jìn)行截取
/** * 對(duì)長(zhǎng)字符串截短,以字符長(zhǎng)度截取,中文占兩字符;{{str|truncatex(4,'...')}} * @param str * @param length,新字符串長(zhǎng)度(按照英文字符算,一個(gè)中文占兩字符),包含truncation的字符個(gè)數(shù) * @param truncation,新字符串的結(jié)尾的字段 * @returns {返回新字符串} */ avalon.filters.truncatex = function (str, length, truncation) { var chinese_pattern = /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/gi; // [\u4E00-\u9FA5]表示漢字,[\uFE30-\uFFA0]表示全角 str = str || " "; length = length || 30; truncation = typeof truncation === "string" ? truncation : "..."; var chineseIn = function (s) { return chinese_pattern.exec(s) ? true : false; }; var calcSize = function(source){ var strTemp = source.replace(chinese_pattern, "aa"); return strTemp.length; }; var recursion = function (source, length) { if (calcSize(source) <= length || (!chineseIn(source))) { return source; } else { return recursion(source.slice(0, source.length - 1), length); } }; var sliceLength = length - truncation.length; return calcSize(str) > length ? recursion(str.slice(0, sliceLength), sliceLength) + truncation : String(str); }
以上所述是小編給大家介紹的Avalon中文長(zhǎng)字符截取、關(guān)鍵字符隱藏、自定義過(guò)濾器的相關(guān)知識(shí),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
自己封裝的一個(gè)簡(jiǎn)單的倒計(jì)時(shí)功能實(shí)例
下面小編就為大家?guī)?lái)一篇自己封裝的一個(gè)簡(jiǎn)單的倒計(jì)時(shí)功能實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11改變文件域的樣式實(shí)現(xiàn)思路同時(shí)兼容ie、firefox
正如標(biāo)題所言只是模擬了file文件域的外觀,其實(shí)起作用的還是文件域file,這樣就很方便,感興趣的朋友可以了解下2013-10-10Javascript的promise,async和await的區(qū)別詳解
這篇文章主要為大家詳細(xì)介紹了Javascript的promise,async和await的區(qū)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03Wordpress ThickBox 點(diǎn)擊圖片顯示下一張圖的修改方法
Wordpress自帶的ThickBox特效中,單擊圖片會(huì)調(diào)用 tb_remove 以關(guān)閉特效窗口,現(xiàn)將修改其動(dòng)作為顯示下一張圖。2010-12-12bootstrap 模態(tài)框(modal)實(shí)現(xiàn)水平垂直居中顯示
這篇文章主要為大家詳細(xì)介紹了bootstrap 模態(tài)框modal實(shí)現(xiàn)水平垂直居中顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01原生javascript實(shí)現(xiàn)拖動(dòng)元素示例代碼
首先改變被拖動(dòng)元素的布局屬性,接著捕捉鼠標(biāo)事件,當(dāng)觸發(fā)mousedown時(shí),記錄下當(dāng)前鼠標(biāo)在元素中的相對(duì)位置,接著處理mousemove事件2014-09-09