Javascript angular.js:使用指令插入另一个指令作为属性

Javascript angular.js:使用指令插入另一个指令作为属性,javascript,angularjs,angular-ui,Javascript,Angularjs,Angular Ui,例如,有一个名为“typeahead”的指令,该指令建议字段的值。假设我想做一个指令,我可以用它作为一个元素的属性,这将导致为该元素建议颜色 这是一个失败的尝试 指令: angular.module('myApp') .directive('suggestcolors', function () { return { compile: function compile(element, attrs) { attrs.$set("typeahead", "c

例如,有一个名为“typeahead”的指令,该指令建议字段的值。假设我想做一个指令,我可以用它作为一个元素的属性,这将导致为该元素建议颜色

这是一个失败的尝试

指令:

angular.module('myApp')
  .directive('suggestcolors', function () {
    return {
      compile: function compile(element, attrs) {
        attrs.$set("typeahead", "color for color in ['red', 'blue', 'green']");
      }
    };
  });
视图:


当我检查textarea时,该属性已经设置,但它没有做任何事情。如果将对attrs的更改移动到link函数,也会发生同样的情况。直接在视图中设置typeahead属性可按预期工作:

<textarea ng-model="foo" typeahead="color for color in ['red', 'blue', 'green']"></textarea>

(但出于干燥的原因,我希望能够动态插入此属性。我的实际用例比这更复杂。)


有人问了一个类似的问题(关于在编译步骤中动态添加ng click行为),但没有直接回答。

编译后,AngularJS只为所有子元素调用
$compile
。元素本身不会自动重新编译,因此在此阶段添加指令将无效。在您的例子中,我认为您可以将其从编译函数更改为链接函数(因此您可以得到一个
scope
参数),然后自己调用
$compile(element)(scope)

看到这里,我有一个指令添加了
style=“color:red”
,另一个指令“动态”添加了该指令。它不起作用,除非我随后调用
$compile


如果您查看该小提琴中的控制台,您将看到发生无限递归(
RangeError:超出了最大调用堆栈大小
)。另外,像这样调用
$compile
是监视程序泄漏的一种方式,因为您没有注销上一次调用
$compile
调用的监视程序。泄漏监视程序的一个示例:这是一个很好的观点,我没有发现!我本想在编译后取消设置该属性,但您泄漏手表的观点是有道理的。如果你对这个问题有一个完整的答案,我将投票支持你的答案。谢谢至于标题中的问题,不,我没有很好的答案。
<textarea ng-model="foo" typeahead="color for color in ['red', 'blue', 'green']"></textarea>