与rootScope交互的指令不适用于Angular JS

时间:2013-11-12 16:47:23

标签: javascript angularjs

我正在尝试与rootScope进行互动,以便制作模态。我有一个非常基本的指令,我试图使用rootScopeng-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但是,我的模式未显示。如果我将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>

但结果相同。

1 个答案:

答案 0 :(得分:2)

你没有做错什么,你只是缺少一行代码。在这个声明中:

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的更多信息,请查看此great article。最后,我已经使用您的代码组装了一个Plunker here,以便您进行测试。