AngularJS transclude的細節(jié)

2018-07-26 17:17 更新

transclude 有兩方面的東西,一個是使用 $compile 時傳入的函數(shù),另一個是定義指令的 compile 函數(shù)時接受的一個參數(shù)。雖然這里的一出一進本來是相互對應的,但是實際使用中,因為大部分時候不會手動調(diào)用 $compile ,所以,在“默認”情況下,指令接受的 transclude 又會是一個比較特殊的函數(shù)。

看一個基本的例子:

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 函數(shù)的第三個參數(shù),就是我們手工 $compile 時傳入的。

如果不是手工 $compile ,而是 ng 初始化時找出的指令,則 transclude 是一個 link 函數(shù)(指令定義需要設置 transclude 選項):

<div more>123</div>
app.directive('more', function($rootScope, $document){
  var func = function(element, attrs, link){
    var node = link($rootScope);
    node.removeAttr('more'); //不去掉就變死循環(huán)了
    $('body', $document).append(node);
  }

  return {compile: func,
          transclude: 'element', // element是節(jié)點沒,其它值是節(jié)點的內(nèi)容沒
          restrict: 'A'};
});
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號