@vasIvas

Как создать «автономную» директиву AngularJS?

Играться в AngularJS начал не так давно и создать на нем что-то настоящее только собираюсь.
Сегодня, вопрос на Тостере о директивах, указал на пробел, который я так и не смог закрыть.

Можно долго объяснять о чем именно я спрашиваю и по этому лучше покажу -
<ng-custom-input remove-char="s"></ng-custom-input>

Возможно ли создать "что-то" настолько автономное, чтобы написав код выше,
на странице появлялся input, который бы удалял при вводе все указанные символы?

Мне немного объяснили как создать с использованием модели, но этот способ обязывает
записывать в теге директивы ещё и модель, а где модель там и контроллер. Так и теряется
шарм компонента.. Хотя бы на словах.

**UPD:**
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>angular</title>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.2/angular.js"></script>
</head>
<body ng-app="app">
	<script>
		var app = angular.module('app', []);
		app.controller('InputRemoveCharController', ['$scope', function($scope){
			this.model = {
				value: ''
			};
		}]);

		app.directive('inputDirective', ['$injector', function(){
			return {
				require: '?ngModel' ,
				link: function($scope, iElm, iAttrs, model) {
					if(!model){
						return;
					}

					var charForRemove = iAttrs.char;
					
					model.$setViewValue = function(value){
						if(value.indexOf(charForRemove) > -1){
							value = value.replace('s', '');
							model.$setViewValue(value);
							model.$render();
						}
					};
				}
			};
		}]);

	</script>
	<div ng-controller="InputRemoveCharController as inputRemoveCharController">
		<input type="text" input-directive char="s" ng-model="inputRemoveCharController.model.value">
	</div>
</body>
</html>


***UPD: 2***
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>angular</title>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.2/angular.js"></script>
</head>
<body ng-app="app">
	<script>
		var app = angular.module('app', []);
		app.controller('InputRemoveCharController', ['$scope', function($scope){
			this.model = {
				value: ''
			};
		}]);

		app.directive('inputDirective', ['$injector', function(){
			return {
				require: '?ngModel' ,
				link: function($scope, iElm, iAttrs, model) {
					if(!model){
						return;
					}

					var charForRemove = iAttrs.char;

					model.$parsers.push(removeChar);

					function removeChar(string){
						if(string.indexOf(charForRemove) > -1){
							string = string.replace(charForRemove, '');
							model.$setViewValue(string);
							model.$render();
						}
					}
				}
			};
		}]);

	</script>
	<div ng-controller="InputRemoveCharController as inputRemoveCharController">
		<input type="text" input-directive char="s" ng-model="inputRemoveCharController.model.value">
	</div>
</body>
</html>
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
а где модель там и контроллер

И что в этом такого? А вы хотите кусок кода в стиле jquery? можно все запихнуть в link и молиться что все будет работать.

В Angular для двустороннего биндинга данных на инпуты используется директива ngModel. То есть вообще все что хочет менять данные должно зависить от нее. Вот и все.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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