【发布时间】:2016-06-02 00:31:20
【问题描述】:
我想通过属性将“模板”传递给指令。这是我想要完成的一个老生常谈的例子:
这个 HTML:
<greeter person-name="Jim" greeting-template="Hello {{name}}"></greeter>
会产生输出:Hello Jim。
我试过这样的指令:
function greeter($interpolate) {
var directive = {
link: link,
restrict: 'EA',
template: '<div>{{evaluatedTemplate}}</div>'
};
return directive;
function link(scope, element, attrs) {
scope.name = attrs.personName;
scope.evaluatedTemplate = $interpolate(attrs.greetingTemplate)(scope);
}
}
但这不起作用,因为greeting-template 属性中的{{name}} 在到达指令链接函数之前会在父作用域中进行评估。
最终,我需要attrs.greetingTemplate 的值字面意思是一个字符串:'Hello {{name}}'。我想我可以用一些替代语法来做到这一点,比如将greeting-template 属性值设置为:“Hello [name]”并在插值之前将“[”转换为“{{”。但这感觉很乱。我也查看了嵌入,但是它根据 parent 范围评估指令的方式看起来可能会在我有多个问候语时引起问题。
【问题讨论】:
-
在
greeter元素上设置ng-non-bindable属性不仅可以防止greeting-template属性被Angular 评估(好),它还可以防止整个指令被评估(坏)。所以这不是答案。 -
在 html 中使用不同的大括号而不是
{{}}并自己解析它们。或者使用选项对象并从控制器传入 -
查看传递给
link函数的其他对象,我发现element.attr('greeting-template')返回'Hello {{name}}'。这正是我正在寻找的。但是如果没有对对象有更完整的了解,我很担心是否有任何我没有看到的边缘情况。
标签: angularjs angularjs-directive