2015-11-23 104 views
2

是否有可能以某種方式在compile函數中添加指令作爲簡單屬性並讓角度句柄編譯添加指令?AngularJS:添加屬性,編譯指令

提供的示例波紋管顯然不起作用,但我的正確問題是,實現該目標的最簡潔方法是什麼?

var app = angular.module('app', []); 
 

 
app.directive('testOne', function ($compile) { 
 
    return { 
 
    restrict: 'A', 
 
    priority: 10000, 
 
    compile: function (element, attrs) { 
 
     
 
     element.attr('test-two', ''); 
 
    } 
 
    }; 
 
}); 
 

 
app.directive('testTwo', function() { 
 
    return { 
 
    restrict: 'A', 
 
    priority: 10, 
 
    compile: function (element, attrs) { 
 
     console.log(2); 
 
    } 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<div ng-app="app"> 
 

 

 
    <div test-one></div> 
 

 

 
</div>

回答

4

在鏈接階段,你可以調用$compile(element)(scope)重新編譯的元素,讓AngularJS拿起新添加的指令。但是,爲了防止無限循環(因爲你最初的指令也將重新編譯),你應該首先刪除初始指令的屬性:

link: function (scope, element) { 
    element.removeAttr('test-one'); 
    element.attr('test-two', ''); 

    $compile(element)(scope); 
} 

編輯:您可能還需要設置terminal: true您的初始指令來防止其他指令在屬性按摩完成之前踢入。出於類似的原因,您可能還必須考慮指令的優先級。

+0

好,所以這是最乾淨的方式:)我想知道如果我能以某種方式避免多個編譯。謝謝! – Clem

+0

另一個問題,如果你知道答案也許。我如何以編程方式更改元素的屬性,以便另一個指令中的$ observe會觸發?我嘗試了attrs。$ set並且沒有運氣。 – Clem

+0

如果指令沒有主動監視屬性表達式的更改,那麼您運氣不好。我會偷看到其他指令的源代碼(如果它不是你的指令),看看是否有任何看着。 –