我有一个带有参数的指令,该参数可以是字符串,也可以是解析为字符串的表达式。我怎样才能确定它是一个还是另一个?
// directive code around these lines...
$scope.$watch(attr.param, function() {
var evaluatedExpr = $parse(attr.param)(scope);
doSomethingWith(evaluatedExpr);
});
// for a string, I just call
doSomethingWith(attr.param);
答案 0 :(得分:3)
如果要将字符串作为表达式进行评估,请使用$ scope。$ eval方法。但是,正如@ChadRobinson指出的那样,这不应该是你需要在你的指令中做的事情,因为expr应该在父范围内进行评估。 请注意,除非您在指令中继承父作用域,否则您的expr可能没有从指令中实际评估所需的信息。
$scope.test = function(v){
var expr = $scope.$eval(v);
if(!expr){
console.log("could not eval, maybe a string... who knows?");
}else{
console.log(expr);
}
}
答案 1 :(得分:2)
您是如何在范围块中定义此参数的?您的选择决定了答案:
@
- 这是一种单向绑定,因此必须是一个表达式。
&
- 这会绑定在父级'中执行的方法。范围,所以你将定义一个“吸气者”'在孩子可以打电话的父母那里。如果您正在编写通用库并且希望使用指令的人能够选择传递的内容,这可能很有用。在这种情况下,您可能希望调用者执行所需的任何$parse
操作。
=
- 这会产生双向绑定,这意味着它必须是属性名称。它不能是表达式(或方法)。
这将提供给您自己的代码示例。您正在设置参数的观察者。这似乎暗示您正在使用双向绑定 - 对单向绑定没有意义,因为它只评估一次。但在这种情况下,你不会打电话给$parse
,因为你有原始值可以使用,而不是表达。