2012-12-26 122 views
3

我現在試圖將我的legace應用程序遷移到Angular,現在陷入下列問題。 我有這樣的簡單形式:Angular.js從控制器訪問模型(服務器驗證)

<form name="loginForm" ng-controller="LoginCtrl" ng-submit="doLogin()"> 
    <input type="text" name="login" ng-model="login.login" /> 
    <span class="errors" ng-show="loginForm.login.$error.required">Required</span> 
    <span class="errors" ng-show="loginForm.login.$error.bad_login">Login or pass incorrect</span> 
    <input type="password" ng-model="login.pass"/> 
</form> 

服務器返回錯誤,因爲這類型的JSON:{登錄: 'bad_login',道: '不正確'} 並在控制器:

function LoginCtrl($scope, $http) { 

    $scope.doLogin = function() { 
     var model = $scope.login; 
     var req = { "login": model.login, "pass": model.pass }; 
     $http({ method: "POST", url: "/login", data: req }).success(function (resp) { 
      if(resp.status != "ok") { 
       angular.forEach(resp, function (value, key) { 
        // ex: model['login'].$setValidity('bad_login', false); 
        model[key].$setValidity(value, false); 
       }); 
      } 
     }); 
    }; 
} 

我嘗試在循環中標記每個字段,而不是用手對每個字段進行硬編碼。但這種方法不起作用。我得到這個錯誤:TypeError: Cannot call method '$setValidity' of undefined,即使當字段留空,我有另一個錯誤:TypeError: Cannot read property 'login' of undefined 所以我認爲我需要獲得形式的每個領域的模型的實例,任何想法?

+1

如果我正確地讀出你的代碼,是你的模型「模型」,而不是模型[K] 。請嘗試使用有意義的參數名稱。不是v,k,p。 – asgoth

+0

更新我的帖子,謝謝你的評論。 我想我應該在這裏有2個模型,每個領域1個模型獨立標記錯誤。我想我現在明白'$ scope.login'是模型,'$ scope.login.pass'不是模型,而是純字符串? – Dfr

+0

事實上,你需要兩個模型(登錄和傳遞),然後你可以使用$ setValidity()。 – asgoth

回答

2

回到未定義的原因是因爲除非實際上爲$ scope.login.login或$ scope.login.pass指定了一些內容,否則它們不會被設置。如果你放置一個空格並刪除它,你會看到它們被設置爲空白。什麼你會想要做的就是在你的控制器的開頭定義登錄的範圍,像這樣:

function LoginCtrl($scope, $http) { 
    $scope.login = { 
     login: "", 
     pass: "" 
    }; 
    $scope.doLogin = function() { 
     var req = { "login": $scope.login.login, "pass": $scope.login.pass }; 
     $http({ method: "POST", url: "/login", data: req }).success(function (resp) { 
      if(resp.status != "ok") { 
       angular.forEach(resp, function (value, key) { 
        // ex: model['login'].$setValidity('bad_login', false); 
        $scope.login[key].$setValidity(value, false); 
       }); 
      } 
     }); 
    }; 
} 
+0

是否可以避免提及控制器中的所有表單域?我有時會有巨大的巨大形式,這將是一件煩人的事情。 – Dfr

+3

謝謝你的回覆,但你的例子我也會得到錯誤:'TypeError:Object has no method'$ setValidity'' – Dfr