$ q.defer(),AngularJS1 $ asyncValidators只匹配数组中的第一个对象

时间:2016-11-07 01:25:16

标签: javascript angularjs validation angular-schema-form

{
  key: "username",
  $asyncValidators: {
    'asynch': function(username) {
      var deferred = $q.defer();
      $timeout(function(){
        for(var i=0; i<=RegUsers.users.length-1; i++) {
          console.log(RegUsers.users[i].username);
          //If username is present in RegUsers
          if(username === RegUsers.users[i].username) {
            console.log(username + " matches " + RegUsers.users[i].username);
            deferred.reject();
          }else {
             deferred.resolve();
          }//$timeout end
        } //for loop end
      }, 200);//
       return deferred.promise;
    }// asynch function end
  }, // $asyncValidators obj end
  validationMessage:  {
    'async': "Username Already Taken"
  }//validationMessage end
},//first obj end

使用Angular Schema Form,我尝试在用户名输入上创建异步验证,但验证仅适用于RegUsers.users数组中的第一个匹配对象。这是我创建的服务,其中包含一组用户详细信息。当通过'async'循环时:function(用户名)匹配并且仅验证第一个对象的用户名。它也与其余用户名匹配,但表单未按要求进行验证。例如:

RegUsers.users = [
  {
    username: "user1",
    email: "user1@gmail.com",
    message: "Hello, my name is user1 "
  },
  {
    username: "user2",
    email: "user2@gmail.com",
    message: "Hello, my name is user2 "
  },
  {
    username: "user3",
    email: "user3@gmail.com",
    message: "Hello, my name is user3 "
  },
  {
    username: "user4",
    email: "user4@gmail.com",
    message: "Hello, my name is user4 "
  }
];

在表单中,如果您在用户名输入字段中输入user1,它将被验证并输出错误消息:“Username Already Taken”。但是,如果您输入user2,user3或user4,这些都不会被验证,但会与RegUsers.users匹配,因此表单保持$ valid无效。我不知道它为什么运作不正常而且......

我还在学习angularJs,这是第一次遇到promises,因为我在Angular Schema Form上跟随DOCS来验证我构建的表单。

0 个答案:

没有答案