3

次のようなフォームがあります。

<form name="myForm" ng-submit="saveDeployment()">
    <input type="hidden" value="{{item.CloneUrl}}" name="cloneurl" />
    <input type="hidden" value="{{Username}}" name="username" />

    <input type="radio" name="deploymenttype" ng-model="item.deploymentType" value="azure" checked="checked">Azure 
    <br />
    <input type="radio" name="deploymenttype" ng-model="item.deploymentType" value="ftp">FTP

    <div id="azure" ng-show="item.deploymentType=='azure'">
        <label for="azurerepo">Azure Git Repo</label>
        <input type="text" name="azurerepo" ng-model="item.azurerepo" ng-class="{error: myForm.azurerepo.$invalid}" ng-required="item.deploymentType=='azure'" />
    </div>

    <div id="ftp" ng-show="item.deploymentType=='ftp'">
        <label for="ftpserver">FTP Server</label>
        <input type="text" name="ftpserver" ng-model="item.ftpserver" ng-class="{error: myForm.ftpserver.$invalid}" ng-required="item.deploymentType=='ftp'"  />

        <label for="ftppath">FTP Path</label>
        <input type="text" name="ftppath" ng-model="item.ftppath" ng-class="{error: myForm.ftppath.$invalid}" ng-required="item.deploymentType=='ftp'" />

        <label for="ftpusername">FTP Username</label>
        <input type="text" name="ftpusername" ng-model="item.ftpusername" ng-class="{error: myForm.ftpusername.$invalid}" ng-required="item.deploymentType=='ftp'"/>

        <label for="ftppassword">FTP Password</label>
        <input type="password" name="ftppassword" ng-model="item.ftppassword" ng-class="{error: myForm.ftppassword.$invalid}" ng-required="item.deploymentType=='ftp'"/>
    </div>

    <input type="submit" value="Save" ng-disabled="myForm.$invalid"/>

</form>

データが入力されると、必須フィールドと [保存] ボタンがすべて機能するようにセットアップされます。ただし、検証の一部として、"Is the user already registered?"入力したデータを使用して、$http を使用して POST 経由でサーバーにアクセスします。

そのロジックをsaveDeployment()関数に配置する必要がありますか、それとも配置するより良い場所はありますか?

*更新: *

要素の属性として適用される以下を実装しましたが、好きではないキーを押すたびにサーバー/データベースを呼び出します:

 app.directive('repoAvailable', function ($http, $timeout) { // available
        return {
            require: 'ngModel',
            link: function (scope, elem, attr, ctrl) {
                console.log(ctrl);
                ctrl.$parsers.push(function (viewValue) {
                    // set it to true here, otherwise it will not 
                    // clear out when previous validators fail.
                    ctrl.$setValidity('repoAvailable', true);
                    if (ctrl.$valid) {
                        // set it to false here, because if we need to check 
                        // the validity of the email, it's invalid until the 
                        // AJAX responds.
                        ctrl.$setValidity('checkingRepo', false);

                        // now do your thing, chicken wing.
                        if (viewValue !== "" && typeof viewValue !== "undefined") {
                            $http.post('http://localhost:12008/alreadyregistered',viewValue) //set to 'Test.json' for it to return true.
                                .success(function (data, status, headers, config) {
                                    ctrl.$setValidity('repoAvailable', true);
                                    ctrl.$setValidity('checkingRepo', true);
                                })
                                .error(function (data, status, headers, config) {
                                    ctrl.$setValidity('repoAvailable', false);
                                    ctrl.$setValidity('checkingRepo', true);
                                });
                        } else {
                            ctrl.$setValidity('repoAvailable', false);
                            ctrl.$setValidity('checkingRepo', true);
                        }
                    }
                    return viewValue;
                });

            }
        };
    });
4

3 に答える 3

1

ディレクティブで $http リクエストを行う必要はありません。より適切な場所はコントローラーです。

コントローラー内でメソッドを指定できます$scope.saveDeployment = function () { // here you make and handle your error on request ... };。エラーをスコープに保存し、$scope.yourResponseObjectそれに基づいて有効性を監視および設定するディレクティブを作成します。

また、代わりに入力フィールドのぼかしでリクエストやエラーのようなものが必要な場合は、有効性を処理するためにコールバックでelem.bind('blur', ...)呼び出す場所で単純なディレクティブを作成する必要があります。$scope.saveDeployment

例を見てください。似たようなものがあるかもしれません - https://github.com/angular/angular.js/wiki/JsFiddle-Examples

于 2013-05-29T21:42:31.593 に答える
0

私の解決策は、コスメティカのアイデアから取られました。

私はangular-uiプロジェクトを使用し、onBlurを介して Web サービスを呼び出すコントローラー上にあるコールバックを設定しました$http

これにより、コントローラー/モデル プロパティが true または false に設定されます。

次に、コントローラー/モデルプロパティを監視するために<span>使用したため、Webサービスが返されたときにユーザー情報が表示されますng-show

于 2013-05-30T13:46:03.873 に答える