2015-09-09 3 views
0

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

<label data-live-email-check="http://www.example-service-uri.com/"> 
    <span class="embedded-label">Email</span> 
    <input ng-model="formData.email" 
      type="email" 
      name="email" 
      placeholder="Email" 
      required/> 
    <span class="message" ng-show="emailValidationMessage">{{emailValidationMessage}}</span> 
</label> 

Я хочу создать директиву, которая принимает URL, предоставленный атрибутом данных живых электронных проверочного и отправляет электронной почты на этот URL-адрес, проверяя, существует ли он или нет.

angular.module("App").directive("liveEmailCheck", [function() { 
    return { 
     restrict: "A", 
     scope: { 
      ngModel: "=" 
     }, 
     link: function (scope, element, attrs) { 
      scope.$watch(
       function(){ 
        return scope.ngModel 
       }, 
       function(newVal){ 
        console.log(newVal); 
       } 
      ); 
     } 
    } 
}]); 

Я просто хочу посмотреть модель на входе и запустить запрос при его обновлении. Поскольку директива определена на элементе метки ngModel не привязана должным образом. Что я делаю не так? Мое выражение часов не регистрирует ничего, потому что оно никогда не срабатывает.

Я знаю, что могу вручную захватить вход, но это похоже на то, что я нарушу «угловой узор», который я чувствую так «привязан». Неудача заключается в том, что, кажется, существует так много способов сделать все в Angular, что я не могу сказать, правильно ли я приближаюсь к проблеме.

--Edit--

Чтобы обеспечить решение, которое я лично бы взять (из-за незнания «лучшего» пути), были бы следующие:

angular.module("App").directive("liveEmailCheck", [function() { 
    return { 
     restrict: "A", 
     require: ["^form"], 
     link: function (scope, element, attrs, ctrl) { 
      var formCtrl = ctrl[0]; 
      scope.formEl = formCtrl[element.find("input").attr("name")]; 


      scope.$watch(function(){return scope.formEl.$valid}, 
       function(newVal){ 
        console.log(newVal); 
       }); 
     } 
    } 
}]); 

Это работает , но я чувствую, что он «нарушает угловые правила».

+0

Почему вы используете его на этикетке? Являются ли этикетки и их содержимое инкапсулированы в другую директиву? –

+0

Да, они есть, но это неважно (один должен иметь возможность использовать его без этой директивы об упаковке). Важно то, что emailValidationMessage должен отвечать в соответствии с областью действия директивы. Его вводящее в заблуждение имя, потому что это не проверка, его проверить, существует ли электронное письмо. – dudewad

+0

Как вы проверяете, существует ли почта или нет с реализацией, предусмотренной в блоке редактирования? –

ответ

0

Пользовательская проверка записывается так:

'use strict'; 

angular.module('App') 
    .directive('liveEmailCheck', function(){ 

    return { 
     require: 'ngModel', 
     link: function (scope, elem, attr, ngModel){ 
     ngModel.$validators.liveEmailCheck= function (value){ 
     //Your logic here or in a factory 
     }; 
     } 
    }; 
    }); 

, а затем на вашем HTML он идет как

<input type="email" live-email-check="liveEmailCheck> 

В основном вы добавить свои собственные проверки в набор сборки в валидациях от углового ,

+0

Но мне нужна директива быть на внешнем элементе метки. Другие теги нуждаются в области директивы, потому что такие вещи, как validationMessage, среди других будущих дополнений, должны быть в области действия директивы. Можете ли вы придерживаться предоставленной разметки и обеспечить такое решение?Кроме того, именование путается - директива не предназначена для «проверки» ввода, его цель - «проверить», существует ли электронная почта в удаленном источнике данных. – dudewad

+0

Что вызывает другой вопрос, нужно ли мне сделать две инструкции для этого? Это один из тех случаев, когда меня угнетает Угловая. Я чувствую, что вы должны сделать это с помощью одного фрагмента кода. – dudewad

+0

Хм, хорошо, я понимаю, что вы имеете в виду. Да, я знаю это чувство угловатым. Директивы - полный беспорядок! Как насчет использования вашей ng-модели в вашем входе и оценить ее как выражение в вашей директиве с помощью '{{formData.email}}', а затем использовать мой пользовательский валидатор ??? Просто догадка ... – Michelangelo

0

Что вам нужно, это ng-model asyncValidator. Вот простая реализация такой директивы.

angular.module("App").directive('asyncEmailValidator', function ($http) { 
    return { 
    require: 'ngModel', 
    link: function (scope, element, attrs, ngModel) { 
     var emailValidationUrl = attrs.asyncEmailValidator; 
     ngModel.$asyncValidators.emailValidator = function (modelValue, viewValue) { 
     var value = modelValue || viewValue; 
     // NOTE: don't forget to correctly add the value to the url 
     return $http(emailValidationUrl + value).then(function (validationResponse) { 
      // NOTE: return rejected promise if validation failed else true 
     }); 

     }; 
    } 
    }; 
}); 

Как вы можете использовать его в вашем случае:

<label> 
    <span class="embedded-label">Email</span> 
    <input ng-model="formData.email" 
      async-email-validator="http://www.example-service-uri.com/" 
      type="email" 
      name="email" 
      placeholder="Email" 
      required/> 
    <span class="message" ng-show="<FormNameHere>.email.$error.emailValidator"> 
     {{emailValidationMessage}} 
    </span> 
</label> 

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

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