从Angular中的模块中删除指令

时间:2013-05-24 12:03:13

标签: angularjs angularjs-directive

我们正试图弄清楚在“预览”模式下是否有临时删除/替换/覆盖一组指令的方法。

我们已尝试删除包含指令的模块,例如:

angular.module('myModule', []);

但指令仍然有效。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:7)

内部AngularJS通过在指令名称中添加后缀,从指令创建工厂。因此,您可以通过用noop工厂替换工厂来禁用指令。

var noopDirective = function() { return function () {}; };
if (previewMode) {
    // Disable ngPaste directive
    angular.module('myModule')
        .factory('ngPasteDirective', noopDirective);
}

确保这是最后执行的代码。

答案 1 :(得分:1)

作为替代方案,请考虑将预览模式放入每个指令中。传入属性以指示当前状态是预览还是“实时”,并使用ng-switch对指令模板进行条件化。

口味各不相同,但对我而言,这比对动态重新定义指令更为清晰。

答案 2 :(得分:1)

this answer中,描述了如何删除内置的角度指令。 基于这个想法,我的建议是这样做:

angular.module('myModule', [])
  // ... registering some stuff on the module
  .config(['$provide', function ($provide) {
    // Remove the progress directive of 'ui.bootstrap'.
    // Otherwise we cannot use native progress bar.
    $provide.decorator('{DIRECTIVE_NAME}Directive', ['$delegate', function ($delegate) {
      $delegate.pop();
      return $delegate;
    }]);
  }]);

$delegate.pop()删除最后添加的名称为{DIRECTIVE_NAME}的指令。因此,这应该是您自己定义的指令。