### 18.9. Attributes的細節
節點屬性被包裝之后會傳給 `compile` 和 `link` 函數。從這個操作中,我們可以得到節點的引用,可以操作節點屬性,也可以為節點屬性注冊偵聽事件。
<test a="1" b c="xxx"></test>
var app = angular.module('Demo', [], angular.noop);
app.directive('test', function(){
var func = function($element, $attrs){
console.log($attrs);
}
return {compile: func,
restrict: 'E'}
整個 _Attributes_ 對象是比較簡單的,它的成員包括了:
_$$element_ 屬性所在的節點。_$attr_ 所有的屬性值(類型是對象)。_$normalize_ 一個名字標準化的工具函數,可以把 `ng-click` 變成 `ngClick` 。_$observe_ 為屬性注冊偵聽器的函數。_$set_ 設置對象屬性,及節點屬性的工具。
除了上面這些成員,對象的成員還包括所有屬性的名字。
先看 _$observe_ 的使用,基本上相當于 _$scope_ 中的 _$watch_ :
<div ng-controller="TestCtrl">
<test a="{{ a }}" b c="xxx"></test>
<button ng-click="a=a+1">修改</button>
</div>
var app = angular.module('Demo', [], angular.noop);
app.directive('test', function(){
var func = function($element, $attrs){
console.log($attrs);
$attrs.$observe('a', function(new_v){
console.log(new_v);
});
}
return {compile: func,
restrict: 'E'}
});
app.controller('TestCtrl', function($scope){
$scope.a = 123;
});
_$set_ 方法的定義是: `function(key, value, writeAttr, attrName) { ... }` 。
- _key_ 對象的成員名。
- _value_ 需要設置的值。
- _writeAttr_ 是否同時修改 DOM 節點的屬性(注意區別“節點”與“對象”),默認為 `true` 。
- _attrName_ 實際的屬性名,與“標準化”之后的屬性名有區別。
<div ng-controller="TestCtrl">
<test a="1" ys-a="123" ng-click="show(1)">這里</test>
</div>
var app = angular.module('Demo', [], angular.noop);
app.directive('test', function(){
var func = function($element, $attrs){
$attrs.$set('b', 'ooo');
$attrs.$set('a-b', '11');
$attrs.$set('c-d', '11', true, 'c_d');
console.log($attrs);
}
return {compile: func,
restrict: 'E'}
});
app.controller('TestCtrl', function($scope){
$scope.show = function(v){console.log(v);}
});
從例子中可以看到,原始的節點屬性值對,放到對象中之后,名字一定是“標準化”之后的。但是手動 `$set` 的新屬性,不會自動做標準化處理。
- Introduction
- 關于AngularJS
- 關于本文檔
- 開始的例子
- 依賴注入
- 作用域
- 數據綁定與模板
- 數據->模板
- 模板->數據
- 數據->模板->數據->模板
- 模板
- 定義模板內容
- 內容渲染控制
- 節點控制
- 事件綁定
- 表單控件
- 模板中的過濾器
- 排序 orderBy
- 過濾列表 filter
- 其它
- 例子:表頭排序
- 例子:搜索
- 錨點路由
- 路由定義
- 參數定義
- 業務處理
- 定義模板變量標識標簽
- AJAX
- HTTP請求
- 廣義回調管理
- 工具函數
- 上下文綁定
- 對象處理
- 類型判定
- 其它服務
- 日志
- 緩存
- 計時器
- 表達式函數化
- 模板單獨使用
- 自定義模塊和服務
- 模塊和服務的概念與關系
- 定義模塊
- 定義服務
- 引入模塊并使用服務
- 附加模塊 ngResource
- 使用引入與整體概念
- 基本定義
- 基本使用
- 定義和使用時的占位量
- 實例
- AngularJS與其它框架的混用(jQuery, Dojo)
- 自定義過濾器
- 自定義指令directive
- 指令的使用
- 指令的執行過程
- 基本的自定義方法
- 屬性值類型的自定義
- Compile的細節
- transclude的細節
- 把節點內容作為變量處理的類型
- 指令定義時的參數
- Attributes的細節
- 預定義的 NgModelController
- 預定義的 FormController
- 示例:文本框
- 示例:模板控制語句 for
- 示例:模板控制語句 if/else