Angularjs字符串值或表达式?

时间:2014-08-25 12:24:46

标签: javascript angularjs angularjs-directive angularjs-scope directive

我有一个带有参数的指令,该参数可以是字符串,也可以是解析为字符串的表达式。我怎样才能确定它是一个还是另一个?

// 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);

2 个答案:

答案 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,因为你有原始值可以使用,而不是表达。