2013-01-04 113 views
3

我在將AngularJS中的客戶端驗證和服務器端驗證相結合時遇到了一些麻煩。這裏的HTML:AngularJS服務器和客戶端表單驗證

<form class="form-login" name="loginForm" novalidate ng-submit="login()"> 
    <fieldset> 
     <h2>Login</h2> 
     <input type="text" required class="input-block-level" placeholder="Username" ng-model="username" name="username"> 
     <div ng-show="loginForm.username.$dirty && loginForm.username.$invalid"> 
      <span ng-show="loginForm.username.$error.required">Username required.</span> 
     </div> 
     <input type="password" required class="input-block-level" placeholder="Password" ng-model="password" name="password"> 
     <div ng-show="loginForm.password.$dirty && loginForm.password.$invalid"> 
      <span ng-show="loginForm.password.$error.required">Password required.</span> 
     </div> 
     <div ng-show="loginForm.username.$dirty && loginForm.password.$dirty && loginForm.$invalid"> 
      <span>Invalid username or password</span> 
     </div> 
     <p><a href="#forgotPassword" data-toggle="modal" class="btn btn-link">Forgot password?</a></p> 
     <p><button class="btn btn-primary btn-large" ng-disabled="loginForm.$invalid" type="submit">Login</button></p> 
    </fieldset> 
</form> 

...這是登錄功能:直到我提交表單,並得到一個404個狀態

$scope.login = function() { 
    $http.post('url', { 
     "password": $scope.password 
    }).success(function(data, status, headers, config) { 
     console.log(status); 
     console.log(data); 
    }).error(function(data, status, headers, config) { 
     if (404 === status) { 
      $scope.loginForm.$invalid = true; 
     } 
    }); 
    return false; 
} 

客戶端驗證工作正常。當404狀態返回時,loginForm。$ invalid錯誤出現,但當我再次更改用戶名和密碼輸入時,客戶端驗證不會將表單狀態更改爲有效。

是否有一種標準的方式來做這種客戶端+服務器端驗證在相同的形式?

回答

4

我不認爲你應該直接修改表格$invalid$valid。你應該通過$setValidity(validationErrorKey, isValid)來完成。

爲什麼不在一個單獨的範圍屬性中存儲「無效的用戶名/密碼」狀態?

$scope.login = function() { 
    $http.post('url', { 
     "password": $scope.password 
    }).success(function(data, status, headers, config) { 
     console.log(status); 
     console.log(data); 
    }).error(function(data, status, headers, config) { 
     if (404 === status) { 
      $scope.invalidUsernamePassword = true; // <-------------- 
     } 
    }); 
    return false; 
} 

而且模板會更簡單:

<div ng-show="invalidUsernamePassword"> 
    <span>Invalid username or password</span> 
</div> 
+0

你真的有一個點在這裏:)之前我張貼了我的問題這裏我試圖做$ scope.loginForm。$ setValidity('somekey',false),結果是它創建了$ scope.loginForm。$ error.somekey等於undefined。我可能做得不對。你有什麼想法嗎? – lucassp

+0

@lucassp有兩個'$ setValidity'方法。一個在窗體控制器上,另一個在ngModel控制器上。事情是,第一個是內部方法,你不應該直接調用它(它實際上需要三個參數)。 所以你應該這樣做,而不是:'username。$ setValidity('validCredentials',false)' – pavelgj