### 18.6. transclude的細節
`transclude` 有兩方面的東西,一個是使用 `$compile` 時傳入的函數,另一個是定義指令的 `compile` 函數時接受的一個參數。雖然這里的一出一進本來是相互對應的,但是實際使用中,因為大部分時候不會手動調用 `$compile` ,所以,在“默認”情況下,指令接受的 `transclude` 又會是一個比較特殊的函數。
看一個基本的例子:
var app = angular.module('Demo', [], angular.noop);
app.directive('more', function(){
var func = function(element, attrs, transclude){
var sum = transclude(1, 2);
console.log(sum);
console.log(element); }
return {compile: func,
restrict: 'E'};
});
app.controller('TestCtrl', function($scope, $compile, $element){
var s = '<more>123</more>';
var link = $compile(s, function(a, b){return a + b});
var node = link($scope);
$element.append(node);
});
angular.bootstrap(document, ['Demo']);
我們定義了一個 `more` 指令,它的 `compile` 函數的第三個參數,就是我們手工 `$compile` 時傳入的。
如果不是手工 `$compile` ,而是 ng 初始化時找出的指令,則 `transclude` 是一個 `link` 函數(指令定義需要設置 `transclude` 選項):
<div more>123</div>
app.directive('more', function($rootScope, $document){
var func = function(element, attrs, link){
var node = link($rootScope);
node.removeAttr('more'); //不去掉就變死循環了
$('body', $document).append(node);
}
return {compile: func,
transclude: 'element', // element是節點沒,其它值是節點的內容沒
restrict: 'A'};
});
- Introduction
- 關于AngularJS
- 關于本文檔
- 開始的例子
- 依賴注入
- 作用域
- 數據綁定與模板
- 數據->模板
- 模板->數據
- 數據->模板->數據->模板
- 模板
- 定義模板內容
- 內容渲染控制
- 節點控制
- 事件綁定
- 表單控件
- 模板中的過濾器
- 排序 orderBy
- 過濾列表 filter
- 其它
- 例子:表頭排序
- 例子:搜索
- 錨點路由
- 路由定義
- 參數定義
- 業務處理
- 定義模板變量標識標簽
- AJAX
- HTTP請求
- 廣義回調管理
- 工具函數
- 上下文綁定
- 對象處理
- 類型判定
- 其它服務
- 日志
- 緩存
- 計時器
- 表達式函數化
- 模板單獨使用
- 自定義模塊和服務
- 模塊和服務的概念與關系
- 定義模塊
- 定義服務
- 引入模塊并使用服務
- 附加模塊 ngResource
- 使用引入與整體概念
- 基本定義
- 基本使用
- 定義和使用時的占位量
- 實例
- AngularJS與其它框架的混用(jQuery, Dojo)
- 自定義過濾器
- 自定義指令directive
- 指令的使用
- 指令的執行過程
- 基本的自定義方法
- 屬性值類型的自定義
- Compile的細節
- transclude的細節
- 把節點內容作為變量處理的類型
- 指令定義時的參數
- Attributes的細節
- 預定義的 NgModelController
- 預定義的 FormController
- 示例:文本框
- 示例:模板控制語句 for
- 示例:模板控制語句 if/else