Angular模板與表達(dá)式的綁定

https://segmentfault.com/a/1190000003712937

我們以下使用的angular
的版本是1.3.x,完整的代碼在文章的最后面,在線的例子demo注意,我下面給出的代碼示例只是截取了一部分挨决,完整的部分在文章的最后面盒发。

1.首先我們最常使用的一個(gè)綁定表達(dá)式的指令是ngBind
兔沃,比如在一個(gè)div
標(biāo)簽中我們可以這樣使用:
<div ng-bind="vm.info"></div>

這樣就把控制器中的vm.info
的值綁定到這個(gè)div
標(biāo)簽里面了,使用這個(gè)指令還有一個(gè)好處就是在頁(yè)面還沒(méi)有完全渲染好的情況下卵沉,是不會(huì)出現(xiàn)Angular的{{}}
解析符號(hào)的颠锉,它隱藏了Angular解析表達(dá)式的過(guò)程。如果你使用了下面的方法史汗,
<div>{{vm.info}}</div>

在網(wǎng)速不是很好的情況下琼掠,就會(huì)出現(xiàn){{}}
解析符號(hào),給用戶帶來(lái)不好的體驗(yàn)停撞。
2.下一個(gè)綁定表達(dá)式的指令就是ngBindTemplate
了瓷蛙,這個(gè)指令與上一個(gè)指令的最大不同之處是:ngBindTemplate
可以綁定多個(gè)表達(dá)式,這樣就有一個(gè)好處戈毒,在一些元素中艰猬,比如title
和option
是不可以包含sapn
元素的,這時(shí)候如果需要多個(gè)變量的話埋市,ngBindTemplate
就是很必須的冠桃。

<div ng-bind-template="{{vm.info}} {{vm.msg}}"></div>

還要注意一點(diǎn)就是,這個(gè)指令的用法道宅,多個(gè)模型變量是用{{}}
括起來(lái)的食听。
3.接下來(lái)的一些是關(guān)于模板的綁定胸蛛,第一個(gè)比較常用的是ngBindHtml
,從指令的名字就可以看出來(lái)樱报,這個(gè)指令是綁定一段html
的葬项,那么這個(gè)指令該如何使用呢?我們來(lái)研究一下肃弟,首先玷室,我們需要在控制器定義一段html
代碼,如下所示:
vm.html = '<div class="container">\ <div class="title">{{vm.info}}</div>\ <div class="content">content</div>\ </div>';

然后我們就會(huì)很自然地想到按照下面的方法去使用這個(gè)指令:
<div ng-bind-html="vm.html"></div>

但是當(dāng)你在瀏覽器上運(yùn)行的時(shí)候笤受,卻發(fā)現(xiàn)瀏覽器給你報(bào)了一個(gè)錯(cuò)誤穷缤,如下所示:



說(shuō)你在一個(gè)安全的上下文中使用了不安全的值,怎么解決這個(gè)問(wèn)題呢箩兽?我們可以手動(dòng)的將我們定義的那段html
代碼津肛,變成Angular信任的值,具體的方法是在控制器定義一個(gè)方法如下所示:
function trust_my_html(str){ return $sce.trustAsHtml(str); }

然后在html
中可以這樣使用:
<div ng-bind-html="vm.trust_my_html(vm.html)"></div>

4.上面的方法在一定程度上解決了模板的綁定問(wèn)題汗贫,但是身坐,還有一個(gè)小問(wèn)題,就是模板中的表達(dá)式并沒(méi)有被解析落包,你可以看看我寫的那個(gè)demo部蛇,所以要想解決這個(gè)問(wèn)題,就是有兩個(gè)辦法咐蝇,首先就是你自己寫一個(gè)指令涯鲁,當(dāng)綁定模板的時(shí)候,將模板中的表達(dá)式也給解析了有序,第二個(gè)辦法就是使用別人的插件抹腿,我看到一個(gè)比較好的插件,名字叫做angular-bind-html-compile
旭寿,我們?cè)谖覀兊闹髂K中注入這個(gè)依賴就可以使用這個(gè)指令了警绩,使用方法如下:
<div bind-html-compile="vm.html"></div>

這樣一來(lái),我們模塊中的表達(dá)式也可以被解析了盅称。還有需要注意肩祥,使用這個(gè)指令就不需要我們手動(dòng)的將那段html
片段變成Angular信任的值了。
5.當(dāng)我們仔細(xì)看了看上面所說(shuō)的那個(gè)指令缩膝,發(fā)現(xiàn)也不是那么的難,還不如我們自己寫一個(gè)呢逞盆,不然還要引入他的文件松申,太費(fèi)事了俯逾,具體的代碼如下:
function compileBindHtml($compile){ var directive = { restrict: 'AE', link:linkFunc }; return directive; function linkFunc(scope, elements, attrs){ var func = function(){ return scope.$eval(attrs.compileBindHtml); }; scope.$watch(func, function(newValue){ elements.html(newValue); $compile(elements.contents())(scope); }) } }

我們來(lái)看看這個(gè)指令舅逸,在鏈接函數(shù)中,我們使用$watch
監(jiān)測(cè)func
函數(shù)的返回值琉历,func
函數(shù)的返回值是一個(gè)被$eval
的屬性值,也就是我們的模板值旗笔,然后當(dāng)檢測(cè)到有變化的時(shí)候,就將我們的模板值放置到含有這個(gè)指令的html
標(biāo)簽中蝇恶,然后在使用$compile
服務(wù)將我們的模板給編譯了〈榛。看看其實(shí)也不是那么難的。
6.最后一個(gè)可以用來(lái)綁定模板的指令是ngInclude
贿衍,這個(gè)指令使用的頻率相對(duì)來(lái)說(shuō)比較高一點(diǎn),那么這個(gè)指令怎么使用呢贸辈?我們一起來(lái)研究一下。
方法一裙椭,將模板寫在html
文件中躏哩,這個(gè)過(guò)程要通過(guò)使用script
指令來(lái)實(shí)現(xiàn),如下所示的一個(gè)例子:

<script type="text/ng-template" id="template-1"> <div class="container"> <div class="title">{{vm.info}}</div> <div class="content">content</div> </div> </script>

這里來(lái)講解一下怎么使用這個(gè)script
指令揉燃,首先它的type
屬性值必須是ng-template
扫尺,然后id
值是它的一個(gè)標(biāo)記或者索引,當(dāng)你需要在html
中使用它的時(shí)候就要使用這個(gè)id
的值來(lái)引用這段模板炊汤。
方法二正驻,將模板寫在js
文件中,通過(guò)使用$templateCache
服務(wù)抢腐,來(lái)寫我們的模板姑曙,具體的用法如下:

function configFuc($templateCache){ var template = '<div class="container">\ <div class="title">{{vm.info}}</div>\ <div class="content">content</div>\ </div>'; $templateCache.put('template-2', template); }

我們的模板的索引是template-2
,具體的內(nèi)容就是template
變量里面的內(nèi)容迈倍。
在html
里面使用的方法如下所示:
<div ng-include="'template-1'"></div> <div ng-include="'template-2'"></div>

使用ngInclude
的另一個(gè)好處就是模板里面的表達(dá)式是會(huì)被解析的伤靠。
完整的代碼:
index.html

<body ng-controller="MyController as vm"> <script type="text/ng-template" id="template-1"> <div class="container"> <div class="title">{{vm.info}}</div> <div class="content">content</div> </div> </script> <h1 class="title">ngInclude <span>VS</span> ngBindHtml <span>VS</span> ngBind <span>VS</span> ngBindTemplate</h1> <hr/> <h3>ngBind</h3> <div ng-bind="vm.info"></div> <hr/> <h3>ngBindTemplate</h3> <div ng-bind-template="{{vm.info}} {{vm.msg}}"></div> <hr/> <h3>ngBindHtml</h3> <div ng-bind-html="vm.trust_my_html(vm.html)"></div> <div compile-bind-html="vm.html"></div> <div bind-html-compile="vm.html"></div> <hr/> <h3>ngInclude</h3> <div ng-include="'template-1'"></div> <div ng-include="'template-2'"></div></body>

index.js

(function(){ angular.module('MyApp', ['angular-bind-html-compile']) .run(configFuc) .controller('MyController', MyController) .directive('compileBindHtml', compileBindHtml); configFuc.$inject = ['$templateCache']; MyController.$inject = ['$sce']; compileBindHtml.$inject = ['$compile']; function configFuc($templateCache){ var template = '<div class="container">\ <div class="title">{{vm.info}}</div>\ <div class="content">content</div>\ </div>'; $templateCache.put('template-2', template); } function MyController($sce){ var vm = this; vm.info = 'Hello,World'; vm.msg = 'Thank You!'; vm.html = '<div class="container">\ <div class="title">{{vm.info}}</div>\ <div class="content">content</div>\ </div>'; vm.trust_my_html = trust_my_html; vm.get_trust_html = get_trust_html; function trust_my_html(str){ return $sce.trustAsHtml(str); } function get_trust_html(str){ return $sce.getTrustedHtml(str); } } function compileBindHtml($compile){ var directive = { restrict: 'AE', link:linkFunc }; return directive; function linkFunc(scope, elements, attrs){ var func = function(){ return scope.$eval(attrs.compileBindHtml); }; scope.$watch(func, function(newValue){ elements.html(newValue); $compile(elements.contents())(scope); }) } }})();

style.css

h1.title{ text-align: center;}h1.title span{ color: #CCC;}.container{ width: 100%; height: 60px;}.container .title{ height: 20px; background-color: #b3d4fc; font-size: 20px; line-height: 20px; text-align: center;}.container .content{ height: 40px; background-color: #0000FF; font-size: 15px; line-height: 40px; text-align: center;}h3{ text-align: center; color: #FF0000;}div{ text-align: center;}

參考的資料:How to make ng-bind-html compile angularjs code

2015年09月06日發(fā)布
更多****

4 推薦
收藏

你可能感興趣的文章
Angularjs標(biāo)簽?zāi)0寮虞d原理 4 收藏,2.8k 瀏覽

淺談AngularJS模板 22 收藏啼染,5.5k 瀏覽

AngularJS 使用感受 4 收藏宴合,3k 瀏覽

本文 禁止轉(zhuǎn)載焕梅,如有需要請(qǐng)先聯(lián)系作者。

討論區(qū)

提交評(píng)論
**

×
評(píng)論支持部分 Markdown 語(yǔ)法:bold
italic
link

引用
code

  • 列表
    卦洽。同時(shí)贞言,被你 @ 的用戶也會(huì)收到通知

本文隸屬于專欄
AngularJS
Classical is something not fade,but grow more precious with time pass by,so is dream id dream.

dreamapplehappy作者
關(guān)注專欄

系列文章
Angular2基礎(chǔ)之展示數(shù)據(jù)2 收藏, 142 瀏覽

Angular2基礎(chǔ)之用戶輸入3 收藏阀蒂, 215 瀏覽

Angular2基礎(chǔ)之表單使用6 收藏该窗, 311 瀏覽

掌握Angular2的依賴注入11 收藏, 470 瀏覽

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚤霞,一起剝皮案震驚了整個(gè)濱河市酗失,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌争便,老刑警劉巖级零,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異滞乙,居然都是意外死亡奏纪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門斩启,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)序调,“玉大人,你說(shuō)我怎么就攤上這事兔簇。” “怎么了垄琐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)墩朦。 經(jīng)常有香客問(wèn)我翻擒,道長(zhǎng),這世上最難降的妖魔是什么劳吠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任痒玩,我火速辦了婚禮,結(jié)果婚禮上燃观,老公的妹妹穿的比我還像新娘便瑟。我一直安慰自己到涂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布践啄。 她就那樣靜靜地躺著屿讽,像睡著了一般吠裆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诵棵,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天履澳,我揣著相機(jī)與錄音怀跛,去河邊找鬼。 笑死忠蝗,一個(gè)胖子當(dāng)著我的面吹牛滨溉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闽撤,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哟旗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了饱亮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤近上,失蹤者是張志新(化名)和其女友劉穎壹无,沒(méi)想到半個(gè)月后感帅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岖是,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年豺撑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硬梁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屹电,死狀恐怖危号,靈堂內(nèi)的尸體忽然破棺而出素邪,到底是詐尸還是另有隱情,我是刑警寧澤偷线,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布沽甥,位于F島的核電站,受9級(jí)特大地震影響亥曹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媳瞪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一蛇受、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兢仰,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瞳腌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間儿捧,已是汗流浹背挑宠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工各淀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碎浇。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓奴璃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親溺健。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钮蛛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容