Angularjs 从指令添加指令的通用方法

Angularjs 从指令添加指令的通用方法,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我正在尝试编写一个Angular 1指令,它将动态地向元素添加其他指令。这些其他指令非常复杂,我不想将它们的代码复制并粘贴到这个元指令中。我已经创建了一个plnkr,显示了我正在努力实现的目标 这是指令的副本 function myCustomAttribute($compile) { var priority = 1001; // greater than ng-repeat return { restrict: 'A', compile: compile, p

我正在尝试编写一个Angular 1指令,它将动态地向元素添加其他指令。这些其他指令非常复杂,我不想将它们的代码复制并粘贴到这个元指令中。我已经创建了一个plnkr,显示了我正在努力实现的目标

这是指令的副本

function myCustomAttribute($compile) {
  var priority = 1001; // greater than ng-repeat
  return {
    restrict: 'A',
    compile: compile,
    priority: priority,
    terminal: true,
  };

  function compile(templateElement, templateAttributes, transcludeFn) {
    var attrValue = templateAttributes[attributeDirectiveName];
    templateAttributes.$set(colorDirectiveName, attrValue);

    var compiled = $compile(templateElement, transcludeFn, priority);
    return function linkFn(scope) {
      compiled(scope);
    };
  }

  function doubleCompile(templateElement, templateAttributes, transcludeFn) {
    var attrValue = templateAttributes[attributeDirectiveName];
    templateAttributes.$set(colorDirectiveName, attrValue);
    templateElement.removeAttr('my-custom-attribute');

    return function linkFn(scope, element, attrs, ctrls, transcludeFn) {
        $compile(element, transcludeFn)(scope);
    };
  }
}
compile
函数来自。如plnkr所示,它与具有
transclude:true
和隔离作用域的指令一起使用时会出现问题。它在嵌套ng重复中也有问题

doubleCompile
函数来自。正如plnkr所显示的,它在具有更高优先级的双重编译指令方面存在问题。它也有同样的转移问题


plnkr是我试图在我的应用程序中解决的一个小型示例,除了myCustomAttribute指令之外的所有代码都用于突出显示问题。如何更新
myCustomAttribute
,使其在所有情况下都能工作?

ng repeat本身就是一个非常糟糕的例子。你想做的事情在某个时候不可避免地会变得一团糟。不太实际,可能是XY问题。我一直在走这条路。这将是一个伟大的功能,但它目前还不可用。如果您需要,请为angular.js和ng2发出声音。还有,@estus,我认为这里有合法的用例。特别是为了将功能隔离到不同的乐高风格指令中,而不必每次使用时都在dom中添加一百万个不同的指令。@estus在我链接到的Angular文档中明确地调用了从指令以编程方式添加指令的场景。另外,我链接到的那个问题已经被浏览了8万多次。我不认为这是XY问题。@AaronPool这些功能请求看起来像我正在尝试做的。在实现这些功能之前,这个问题的答案可能是这是一个开放的功能请求。这个问题并不反映您的具体情况。这个主题很容易被误用,没有迹象表明这不是一个问题“通用方式”不是一种好的做事方式,因为它不是惯用的方式。该框架从未被设计为这样做。对于某些事情,您可能希望使用
ng include
,对于另一些事情,它是自编译指令。目前被认为是惯用的方法是具有数据绑定和隔离作用域的指令/组件。不是一个神奇的东西,可以透明地包装每种类型的范围等等。