2014-01-03 3 views
19

Любые идеи о том, где использовать $parse от AngularJS.

Просьба привести любые примеры или ссылки, которые изложены четко.

+0

вы просто разместить угловую документация $ разобрать ваш вопрос? – Claies

+1

да, опубликуйте его, чтобы понять, что это значит – rinesh

+2

Пример того, когда требуется '$ parse': http://stackoverflow.com/a/15725402/215945 –

ответ

22

Угловые пробеги $ анализируются автоматически, когда он запускает цикл $ digest, в основном $ parse - это способ углового вычисления выражений. Если вы хотите вручную разобрать выражение, вы можете ввести службу parse pars в контроллер и вызвать службу, чтобы выполнить синтаксический анализ.

Вот код, перекопанный из ng-книги, который затем обрабатывает выражение.

<div ng-controller="MyCtrl"> 
    <input ng-model="expr" type="text" placeholder="Enter an expression" /> 
    <h2>{{ parsedValue }}</h2> 
</div> 

то в нашем модуле,

angular.module("myApp", []) 
.controller('MyCtrl',['$scope', '$parse', function($scope, $parse) { 
    $scope.$watch('expr', function(newVal, oldVal, scope) { 
     if (newVal !== oldVal) { 
     // Let's set up our parseFun with the expression 
     var parseFun = $parse(newVal); 
     // Get the value of the parsed expression 
     $scope.parsedValue = parseFun(scope); 
     } 
    }); 
}]); 
+1

Ницца. У меня есть небольшой, несвязанный вопрос. Почему вы проверяете, что newVal! == oldVal? Не Угловая автоматически не запускает функцию обратного вызова $ watch, если значение не изменилось, гарантируя тем самым, что newVal и oldVal отличаются тем, как выполняется внутренняя часть функции? –

+1

@NikoBellic: Да. Большую часть времени. :) Когда запускается представление и выполняется первый дайджест, вначале наблюдаются выражения для углового, чтобы сохранить начальное значение для сравнения с последующим. И этот первый вызов имеет одинаковое значение. Оператор 'if' гарантирует, что мы проигнорируем этот первый первоначальный вызов, когда изменение еще не произошло. –

+1

Я очень опаздываю на вечеринку - просто FYI, пожалуйста, используйте этот пример только в примерах приложений. Обсуждает ли в ng-книге реализацию безопасности этого? https://plnkr.co/edit/5QICUyBPYC2Iac2dt1XG?p=preview введите полезную нагрузку a = toString(). constructor.prototype; a.charAt = a.trim; $ eval ('a, alert (1), a') непосредственный разбор пользовательского ввода вызовет проблемы безопасности. – Lewis

8

Вы, вероятно, не будете использовать $ parse напрямую, но это то, что преобразует угловые expressions в функции JavaScript. Выражения представляют собой фрагменты кода, подобные JavaScript, которые обычно помещаются в привязки, такие как {{ expression }}.