国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

angular學習(九)—— 插補

2024-04-27 15:05:16
字體:
來源:轉載
供稿:網友

插補和數據綁定

在angular中,嵌入式表達式插補標記被用于數據綁定文本節點和屬性值。

一個嵌入式表達式插補標記的例子:

<a ng-href="img/{{username}}.jpg">Hello {{username}}!</a>

文本和屬性綁定如何運行

在編譯的過程中,編譯器會使用$interpolate服務去查看文本節點和元素屬性是否包含嵌入式表達式插補標記。如果有的話,就會增加一個interpolateDirective在這個節點上,并且在插補的計算函數上注冊watches,作為常規digest循環的一部分,會更新對應的文本節點和屬性值。

注意,interpolateDirective的優先級為100,并且在預鏈接函數中設置watch。

字符串表達式如何運算

如果插補值不是string,那么它這樣運算:

undefinednull被轉換成''如果值是一個對象,但不是Number,Date,Array,$interpolate將查找對象自定義的toString()函數,自定義意味著myObject.toString !== Object.PRototype.toString.如果以上都不是,將會采用JSON.stringify

boolean屬性的綁定

disabled這樣的屬性就叫做boolean屬性,因為存在就是true,不存在就是false,對它們不能使用普通的屬性綁定,因為HTML規范沒有要求瀏覽器保存boolean屬性值。這意味著,我們在boolean屬性上放一個angularjs插補表達式,這個綁定信息會丟失掉,因為瀏覽器會忽略這個屬性值。

在下面的例子中,插補信息會被忽略掉,瀏覽器會簡單解釋為屬性是存在的,這樣按鈕永遠都是禁用狀態。

Disabled: <input type="checkbox" ng-model="isDisabled" /><button disabled="{{isDisabled}}">Disabled</button>

因此,AngularJS為這些boolean屬性提供了一個特殊的ng為前綴的指令,這些屬性包括:disabled, required, selected, checked, readOnly 和 open。

當boolean屬性的表達式計算為真時,這些指令將設置一個相應的true。

Disabled: <input type="checkbox" ng-model="isDisabled" /><button ng-disabled="isDisabled">Disabled</button>

用ngAttr綁定任意屬性

瀏覽器有時候會挑剔屬性值的有效性。

例如:

<svg> <circle cx="{{cx}}"></circle></svg>

我們希望瀏覽器可以進行綁定,但是我們看控制臺就會發現Error: Invalid value for attribute cx="{{cx}}",因為SVG DOM API的限制,你不能簡單的寫cx="{{cx}}".

用ng-attr-cx,你就可以解決這個問題。

如果帶有綁定的屬性以ngAttr為前綴,綁定的時候就會應用為無前綴的屬性,這將允許你綁定那些會被瀏覽器處理的屬性。當你使用ngAttr時,$interpolate的allOrNothing將會啟用,如果插補表達式的運算結果為undefined,這個屬性就會被移除,不會增加到元素中。

上面的例子使用ngAttr重寫一下:

<svg> <circle ng-attr-cx="{{cx}}"></circle></svg>

如果下修改一些駱駝命名法的屬性,比如在svg元素中的viewBox,可以用下劃線的方式來綁定這些屬性:

綁定viewBox應該這樣寫:

<svg ng-attr-view_box="{{viewBox}}"></svg>

有一些屬性當使用插補時也有不少問題,同樣可以使用ngAttr前綴,已知的這些屬性如下:

size ,<select>元素placeholder ,Internet Explorer 10/11 中的<textarea>元素type ,Internet Explorer 11中的<button>元素value ,Internet Explorer 11中的<progress>元素

已知問題

動態改變插補值

你應該避免動態改變插補字符串的內容(例如屬性值或文本節點),當原始字符串正在運算時,你的改變就會被覆蓋。這個限制適用于用javascr的同時,使用ngStyle指令去更改屬性的內容。

在表達式中內嵌插補

在表達式中嵌入式插補是個不好的做法:

<div ng-show="form{{$index}}.$invalid"></div>

你可以將復制表達式的計算委托給scope,例如:

<div ng-show="getForm($index).$invalid"></div>function getForm(index) { return $scope['form' + index];}

你也可以用this訪問scope,例如

<div ng-show="this['form' + $index].$invalid"></div>

為什么不建議將插補和表達式混合

它增加了標記的復雜性不能保證適用于所有指令,因為插補本身就是一個指令,如果其他指令在插補指令之前訪問數據,那么它將得到一個插補標記而不是數據對性能優影響,因為會增加額外到watch到scope中

因為是不推薦的用法,沒做充足的測試,angular核心代碼的更改會產生bug

如果我的文章對您有幫助,請用支付寶打賞:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海晏县| 桐乡市| 宜兰市| 大安市| 如皋市| 金塔县| 泾川县| 龙岩市| 桑植县| 安庆市| 寻乌县| 平江县| 陕西省| 二连浩特市| 新邵县| 文昌市| 兖州市| 兴化市| 临江市| 浠水县| 仁寿县| 来安县| 康平县| 喀喇沁旗| 青浦区| 武宣县| 大石桥市| 越西县| 大宁县| 贺州市| 永靖县| 阜新市| 瑞金市| 沾化县| 巴林左旗| 藁城市| 岑巩县| 偃师市| 沐川县| 城市| 武义县|