2013-10-06 6 views
1

У меня есть контроллер, как это:Использование регулярных выражений в View

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/

Вопрос: Почему?

+1

Как я могу воспроизвести это в скрипке, с которой вы связались? Нажатие «Запуск» не вызывает никаких ошибок, оно просто печатает код (не заменяется). –

+0

Вы можете обойти это с помощью конструктора 'RegExp':' str.replace (новый RegExp ('Mountain'), 'Plain') '. Обратите внимание, что нет разделителей, вам нужно удвоить все обратные косые черты и модификаторы перейти во второй параметр [см. MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) –

+0

Кстати, почему вы пытаетесь сделать эту логику в HTML? Я думаю, что HTML представляет только «Просмотр» (MVC) –

ответ

2

Поскольку ваш вопрос был «Почему?», Ответ заключается в том, что выражения в блоках интерполяции не являются выражениями JavaScript, а Angular expressions. Они очень похожи на JavaScript (специально), но Angular использует собственный синтаксический анализатор для анализа кода.

Таким образом, он может сделать больше, чем просто оценить выражение один раз: он также может делать такие вещи, как анализ зависимостей, поэтому он может следить за ингредиентами и обновлять их при изменении этих ингредиентов. Он также может оценивать выражение относительно $scope, так что {{foo}} возвращает $scope.foo, а не глобальную переменную, называемую foo (что, в свою очередь, делает такие вещи, как работа ngRepeat).

Когда Угловая команда реализовала угловые выражения, они явно не применяли регулярные выражения. Это неудивительно - такой код должен быть в вашем контроллере в любом случае, где вы можете его протестировать.

+0

отлично, спасибо! причина, по которой он не работает, - это слэши в 'replace (/ Mountain /', когда этот синтаксис работает на 100%: 'replace (« Mountain »', похоже, что Angular team просто забыл реализовать его :) – Cherniv

Смежные вопросы