关于angularjs:从Angular模块中删除指令

Remove a directive from module in Angular

我们正在尝试确定是否有一种方法可以在"预览"模式下临时删除/替换/覆盖一组指令。

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

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

但指令仍处于活动状态。

任何人都可以帮忙吗?


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

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

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


在此答案中,描述了如何删除内置的angular指令。
基于这个想法,我的建议是这样做:

1
2
3
4
5
6
7
8
9
10
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}的指令。因此,这应该是您自己定义的指令。


作为替代方案,请考虑将预览模式置于每个指令中。传递属性以指示当前状态是预览还是\\'live \\',并使用ng-switch条件化指令模板。

口味各不相同,但是与即时定义指令相比,这对我来说是一种更清晰易懂的方法。