1
{
  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 数组中的第一个匹配对象。这是我创建的一项服务,其中包含用户详细信息的集合。当通过“异步”循环时:函数(用户名)匹配并仅验证第一个对象的用户名。它也匹配其余的用户名,但表单未按要求验证。例如:

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,它将被验证并输出错误消息:“用户名已被采用”。但是,如果您输入 user2、user3 或 user4,这些都不会得到验证,而是与 RegUsers.users 匹配,因此表单保持为 $valid insted 而非 $invalid。我不知道为什么它不能正常工作,而且......

我仍在学习 angularJs,这是我第一次遇到 Promise,因为我正在遵循 Angular Schema Form 上的DOCS来验证我构建的表单。

4

0 回答 0