2013-09-26 3 views
0

Это сообщение является шагом вперед angular custom validation unique email trigger once

так с кодом в старом посте я понял, что значение поля электронной почты (когда я отправляю сервер) не определен, поэтому я попытался как

<!doctype html> 
<html data-ng-app="myApp"> 
    <head> 
     <meta charset="utf-8"> 

    </head> 
    <body> 
     <div data-ng-controller="myCtrl"> 
      <form novalidate id="frm-signup" name="addContestantFrm" data-ng-submit="add()"> 
       <div> 
        <label for="email">Email: *</label> 
        <input type="email" id="email" name="email" class="input-medium" tabindex="3" title="email" maxlength="255" value="{{contestant.email}}" placeholder="email" data-ng-model="contestant.email" required email-unique /> 
       </div> 
       <div> 
        <input type="submit" id="sbmt" name="sbmt" class="input-sbt" data-ng-disabled="!addContestantFrm.$valid" value="Send" /> 
       </div> 
      </form> 
     </div> 
     <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 
     <script src="http://code.angularjs.org/1.0.8/angular.min.js"></script> 
     <script> 
      var app = angular.module('myApp', []); 
      app.factory('Contestant',function($http){ 
       return { 
        checkUniqueEmail : function(email){ 
         return $http.post('./checkemail.php',{email:email}); 
        } 
       } 
      }); 
      app.controller('myCtrl',function($scope){ 
       $scope.add = function(){ 
        console.log($scope.contestant); 
       } 
      }); 
      app.directive('emailUnique',function(Contestant) { 
       return { 
        require: 'ngModel', 
        link: function(scope, element, attrs,ctrl) { 
         ctrl.$parsers.unshift(function(viewValue) { 
          console.log(ctrl.$error.email); 
          Contestant.checkUniqueEmail(viewValue).success(function (response) { 
           ctrl.$setValidity('emailUnique', true); 
           scope.$apply(function(scope) { 
            ctrl.$setViewValue('email', viewValue); 
           }); 
           return viewValue; 
          }) 
          .error(function (data) { 
           ctrl.$setValidity('emailUnique', false); 
           console.log(viewValue); 
           return undefined; 
          }); 
         }); 
        } 
       } 
      }); 
     </script> 
    </body> 
</html> 

дать мне $ дайджеста уже в процессе

так хо ш путь, чтобы установить значение электронной почты для отправки на сервер (теперь это просто пример)

Update

Я попытался с если

(!scope.$$phase) { 
    //never excuted 
} 
+0

возможно дубликат [AngularJS проверки пользовательской формы с помощью $ HTTP] (http://stackoverflow.com/questions/16810913/angularjs-custom-form-validation-using -http) – m59

+0

Я написал директиву, чтобы позаботиться об этой функциональности и любых подобных обстоятельствах. Проверьте это здесь: http://stackoverflow.com/a/25678196/1435655 – m59

ответ

1

Я уверен, $http удар блокирует $digest, после чего .$apply от scope пытается отбить другой. Вы просто должны быть в состоянии установить переменную scope и увидеть его отражение, или, возможно, попытаться возвращения всех обещаний с .then

Contestant.checkUniqueEmail(viewValue).success(function (response) { //<- Digest started 
    ctrl.$setValidity('emailUnique', true); 
    /* 
    scope.$apply(function(scope) { //<--Trying to start again 
     ctrl.$setViewValue('email', viewValue); 
    }); 
    */ 
    return viewValue; 
}) 

Использование .then

checkUniqueEmail : function(email){ 
    return $http.post('./checkemail.php',{email:email}).then(function(result) { 
     return result.data; 
    }); 
} 

Contestant.checkUniqueEmail(viewValue).then(function (response) { 
    //try stuff here now. 
}); 
+0

Спасибо tymeJV Я обновил код gist https://gist.github.com/whisher/6714864, но он по-прежнему дает мне undefined :((и с той же ошибкой) – Whisher

0

timeJV был прав, эта проблема идет от обработка почтовых сообщений http. Это должно быть сделано с этим рисунком

var deferred=$q.defer() 
http.post(...).success(...).error(...); 
return defered.promise 

Я создал jsfiddle из кода here и сделал некоторые изменения, так что он работает.

Пожалуйста, скажите мне, если вам нужно что-то еще

+0

Это обещание анти-шаблона и никогда не должно использоваться. – m59

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