### 18.7. 把節點內容作為變量處理的類型
回顧最開始的那個代碼顯示的例子,那個例子只能處理一次節點內容。如果節點的內容是一個變量的話,需要用另外的思路來考慮。這里我們假設的例子是,定義一個指令 `showLenght` ,它的作用是在一段文本的開頭顯示出這段節點文本的長度,節點文本是一個變量。指令使用的形式是:
<div ng-controller="TestCtrl">
<div show-length>{{ text }}</div>
<button ng-click="text='xx'">改變</button>
</div>
從上面的 HTML 代碼中,大概清楚 ng 解析它的過程(只看 `show-length` 那一行):
- 解析 `div` 時發現了一個 `show-length` 的指令。
- 如果 `show-length` 指令設置了 `transclude` 屬性,則 `div` 的節點內容被重新編譯,得到的 `link` 函數作為指令 `compile` 函數的參數傳入。
- 如果 `show-length` 指令沒有設置 `transclude` 屬性,則繼續處理它的子節點( `TextNode` )。
- 不管是上面的哪種情況,都會繼續處理到 `{{ text }}` 這段文本。
- 發現 `{{ text }}` 是一個 `Interpolate` ,于是自動在此節點中添加了一個指令,這個指令的 `link` 函數就是為 `scope` 添加了一個 `$watch` ,實現的功能是是當 `scope` 作 `$digest` 的時候,就更新節點文本。
與處理 `{{ text }}` 時添加的指令相同,我們實現 `showLength` 的思路,也就是:
- 修改原來的 DOM 結構
- 為 `scope` 添加 `$watch` ,當 `$digest` 時修改指定節點的文本,其值為指定節點文本的長度。
代碼如下:
app.directive('showLength', function($rootScope, $document){
var func = function(element, attrs, link){
return function(scope, ielement, iattrs, controller){
var node = link(scope);
ielement.append(node);
var lnode = $('<span></span>');
ielement.prepend(lnode);
scope.$watch(function(scope){
lnode.text(node.text().length);
});
};
}
return {compile: func,
transclude: true, // element是節點沒,其它值是節點的內容沒
restrict: 'A'};
});
上面代碼中,因為設置了 `transclude` 屬性,我們在 `showLength` 的 `link` 函數(就是 `return` 的那個函數)中,使用 `func` 的第三個函數來重塑了原來的文本節點,并放在我們需要的位置上。然后,我們添加自己的節點來顯示長度值。最后給當前的 `scope` 添加 `$watch` ,以更新這個長度值。
- Introduction
- 關于AngularJS
- 關于本文檔
- 開始的例子
- 依賴注入
- 作用域
- 數據綁定與模板
- 數據->模板
- 模板->數據
- 數據->模板->數據->模板
- 模板
- 定義模板內容
- 內容渲染控制
- 節點控制
- 事件綁定
- 表單控件
- 模板中的過濾器
- 排序 orderBy
- 過濾列表 filter
- 其它
- 例子:表頭排序
- 例子:搜索
- 錨點路由
- 路由定義
- 參數定義
- 業務處理
- 定義模板變量標識標簽
- AJAX
- HTTP請求
- 廣義回調管理
- 工具函數
- 上下文綁定
- 對象處理
- 類型判定
- 其它服務
- 日志
- 緩存
- 計時器
- 表達式函數化
- 模板單獨使用
- 自定義模塊和服務
- 模塊和服務的概念與關系
- 定義模塊
- 定義服務
- 引入模塊并使用服務
- 附加模塊 ngResource
- 使用引入與整體概念
- 基本定義
- 基本使用
- 定義和使用時的占位量
- 實例
- AngularJS與其它框架的混用(jQuery, Dojo)
- 自定義過濾器
- 自定義指令directive
- 指令的使用
- 指令的執行過程
- 基本的自定義方法
- 屬性值類型的自定義
- Compile的細節
- transclude的細節
- 把節點內容作為變量處理的類型
- 指令定義時的參數
- Attributes的細節
- 預定義的 NgModelController
- 預定義的 FormController
- 示例:文本框
- 示例:模板控制語句 for
- 示例:模板控制語句 if/else