[英]Directive interacting with rootScope not working in Angular JS
我正在嘗試與rootScope
交互以使模式出現。 我有一個非常基本的指令,我試圖將rootScope
與ng-show
配對使用。
這是指令的代碼:
.directive('modal', ['$rootScope', function ($rootScope) {
return {
restrict: 'A',
templateUrl: 'view/templates/modal-confirm.tpl.html',
link: function (scope, element, attrs) {
console.log(scope);
element.on('click', function() {
scope.$root.confirmModal.isVisible = true;
console.log('open modal');
});
}
}
}])
當我記錄scope
變量時,它顯示為$root
已使用isVisible: true
更新isVisible: true
但是,我的模態沒有出現。 如果我更改scope.$root.confirmModal.isVisible = true;
到$rootScope.confirmModal.isVisible = true;
我得到相同的結果,console.log在工作,但是沒有模式出現。
這是模式模板的代碼:
<!-- Confirm Modal Template -->
<div ng-if="$root.confirmModal.isVisible" class="overlay">
<div class="overlay-content extended">
<span>{{ $root.confirmModal.content }}</span>
<div class="buttons">
<button ng-click="$root.confirmModal.isVisible = false;" class="btn btn-default half">Cancel</button>
</div>
</div>
</div>
是否無法在指令中與$rootScope
進行交互?
使用scope
而不是$rootScope
更新了代碼:
.directive('modal', ['$rootScope', function ($rootScope) {
return {
restrict: 'A',
templateUrl: 'view/templates/modal-confirm.tpl.html',
link: function (scope, element, attrs) {
scope.isVisible = false;
element.on('click', function() {
scope.isVisible = true;
console.log(scope);
console.log('open modal');
});
}
}
}])
<!-- Confirm Modal Template -->
<div ng-if="isVisible" class="overlay">
<div class="overlay-content extended">
<span>hello world</span>
</div>
</div>
但是結果相同。
您沒有做錯什么,只是缺少了一行代碼。 在此聲明中:
element.on('click', function() {
scope.isVisible = true;
console.log(scope);
console.log('open modal');
});
您正在創建一個很好的匿名函數,但是angular不能自動神奇地跟蹤作用域變量所做的更改。您需要做的是在函數結束時顯式地請求摘要循環,或者使用換行$ apply或$ timeout函數中的代碼。 像這樣:
element.on('click', function() {
scope.$apply(function(){ // or $timeout(function() {
scope.isVisible = true;
console.log(scope);
console.log('open modal');
});
});
如果您想了解更多有關$ apply的信息,請查看這篇很棒的文章 。 最后,我在這里用您的代碼組裝了一個Plunker,以便您進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.