【问题标题】:Using RegEx in View在视图中使用正则表达式
【发布时间】:2013-10-06 11:53:36
【问题描述】:

我有一个这样的控制器:

function Ctrl( $scope ){

    $scope.str = " Misty Mountain Hop ";

}

还有这样的视图:

<div ng-controller="Ctrl">

    <p>{{ str }}</p>       <!-- This one is ok -->
    <p>{{ str.split( "Mountain")[0] }}</p>   <!--Even this one is fine too -->
    <p>{{ str.replace( /Mountain/ , "Plain" ) }}</p>  <!-- This one is bad -->

</div>

所以如果我尝试使用replace 方法,它会报错:

Syntax Error: Token 'Mountain' is unexpected ... 

http://jsfiddle.net/H3ztj/

问题是:为什么?

【问题讨论】:

  • 我怎样才能在你链接到的小提琴中重现它?单击“运行”不会产生任何错误,它只是打印代码(未替换)。
  • 您可以使用RegExp 构造函数来解决它:str.replace(new RegExp('Mountain'), 'Plain')。请注意,没有分隔符,您需要将所有反斜杠和修饰符加倍放入第二个参数see MDN
  • 顺便说一句,您为什么尝试在 HTML 中执行此逻辑?我认为 HTML 仅代表 View (MVC)
  • @TimPietzcker 在控制台中可以看到错误
  • @MaximShoustin 我的观点有非常具体的用例,所以我不想把这个功能放在范围内..

标签: javascript regex angularjs


【解决方案1】:

由于您的问题是“为什么?”,答案是插值块中的表达式不是 JavaScript 表达式,而是Angular expressions。它们看起来很像 JavaScript(故意),但 Angular 使用自己的解析器来解析代码。

这样,它可以做的不仅仅是评估一次表达式:它还可以做一些事情,比如分析依赖关系,所以它可以观察成分并在这些成分发生变化时进行更新。它还可以评估相对于$scope 的表达式,以便{{foo}} 返回$scope.foo,而不是一个名为foo 的全局变量(这反过来又使ngRepeat 之类的东西起作用)。

当 Angular 团队实现 Angular 表达式时,他们显然没有实现正则表达式。这并不奇怪——这种代码无论如何都应该在您的控制器中,您可以在其中进行测试。

【讨论】:

  • 太好了,谢谢!它不起作用的原因是 replace(/Mountain/ 中的斜线,当这种语法 100% 有效时:replace("Mountain",所以 Angular 团队似乎只是忘记实现它:)
猜你喜欢
  • 2020-09-14
  • 2013-09-23
  • 2017-01-18
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2013-09-28
相关资源
最近更新 更多