@jack3d

Почему использование $parse не рекомендуется в angularjs?

Друзья, есть такая директива (нагло взята на github ):
(function() {
	"use strict";

	angular.module('app.common').directive('match', passwordVerify);

	function passwordVerify ($parse) {
		return {
			require: '?ngModel',
			restrict: 'A',
			link: function(scope, elem, attrs, ctrl) {


				var matchGetter = $parse(attrs.match);
				var caselessGetter = $parse(attrs.matchCaseless);
				var noMatchGetter = $parse(attrs.notMatch);

				scope.$watch(getMatchValue, function(){
					ctrl.$$parseAndValidate();
				});

				ctrl.$validators.match = function(){
					var match = getMatchValue();
					var notMatch = noMatchGetter(scope);
					var value;

					if(caselessGetter(scope)){
						value = angular.lowercase(ctrl.$viewValue) === angular.lowercase(match);
					}else{
						value = ctrl.$viewValue === match;
					}
					value ^= notMatch;
					return !!value;
				};

				function getMatchValue(){
					var match = matchGetter(scope);
					if(angular.isObject(match) && match.hasOwnProperty('$viewValue')){
						match = match.$viewValue;
					}
					return match;
				}
			}
		};
	}

})();

Но меня завернули на пулл реквесте с обоснованием, что $parse == eval. Но 99% директив используют парс когда надо сравнить 2 поля.
  • Вопрос задан
  • 779 просмотров
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Использование $parse внутри link директивы это нормальная практика, но надо понимать зачем вы это делаете.

В вашем примере достаточно parse заменить на биндинг проперти в скоупе. Единственная причина по которой тут используется $parse - микрооптимизация для уменьшения количества ватчеров.

updated

Поправка, единственная причина почему тут используется $parse вместо изолированного скоупа - то что у ngModel уже есть изолированный скоуп и ангуляр банально не даст создаться двум директивам с изолированными скоупами на одном элементе.
Ответ написан
@lega
$parse != eval, там формируется более-менее изолированная ф-ия, да и eval не страшен если запускать только свой код.

"Половина" Angular.js основана на $parse
Ответ написан
@bromzh
Drugs-driven development
Может потому что это и есть почти тоже, что и eval? Следовательно нужно тщательно проверять входные параметры. А ты сразу вызываешь её от значений атрибутов, даже не проверив их ни на что. Ну и отслеживать ошибки в таких штуках крайне сложно.

habrahabr.ru/post/244001/#comments
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы