1

複数のフォーム検証エラーを表示する angularjs ディレクティブを次に示します。
指令コード -

app.directive('validationErrors', function($compile) {
    return({
        link : function($scope, el, attr) {

            $scope.fld = attr.id;
            $scope.individualValidationErrors = [];
            var model = ((attr.ngModel).split('.'))[0];

            $scope.validationErrors = {};
            $scope.validationErrors[model] = {};
            $scope.validationErrors[model][$scope.fld] = "";

            var html = $compile(
                '<div id="error-{{fld}}" style="color:red;">'+
                    '<ul>' +
                        '<li ng-repeat="error in individualValidationErrors[fld]">'+
                            '{{error}}' +
                        '</li>' +
                    '</ul>' +
                '</div>'
            )($scope);
            $('input[id="'+$scope.fld+'"]').after(html);

            $scope.$watch('validationErrors',
                function(newV) {
                    $scope.fld = attr.id;
                    $scope.individualValidationErrors = [];

                    console.log(newV);
                    console.log($scope.validationErrors);

                    if ($scope.fld != undefined) {
                        $scope.individualValidationErrors[$scope.fld] = $scope.validationErrors[model][$scope.fld];
                        //console.log($scope.individualValidationErrors);
                    }
                },
                true
            );
        }
    });
});

HTML コード -

<form ng-submit="registration()">
    <input validation-errors="validationErrors" maxlength="50" type="text" id="first_name" ng-model="User.first_name">
    <input validation-errors="validationErrors" maxlength="50" type="text" id="last_name" ng-model="User.last_name">
    <input validation-errors="validationErrors" maxlength="50" type="text" id="email" ng-model="User.email">
    <input validation-errors="validationErrors" type="password" id="password"  ng-model="User.password">
    <input class="btn btn-info" type="submit" id="registration-sbmit" value="Submit">
</form>

フォームの最後のフィールドのエラーは、フォーム内のすべてのフィールドを上書きするため、フィールドの個々のエラーは表示されません.. $scope.validationErrors 変数は、ディレクティブで $watch したいコントローラーで設定されます。

4

2 に答える 2

1

ここでの主な問題は、リンク関数で $scope.validationErrors を上書きしていることだと思います。リンク関数は、ページ上のすべてのディレクティブに対して実行されます。また、同じ $scope オブジェクトを共有しています。したがって、条件付きで $scope.validationErrors を作成し、条件付きで最上位のキーを追加する必要があります。

if(!$scope.validationErrors)
    $scope.validationErrors = {};
if(!$scope.validationErrors[model])
    $scope.validationErrors[model] = {};
$scope.validationErrors[model][$scope.fld] = "";

これにより、少なくとも $scope.validationErrors の最後のアイテムしか取得できないという問題が解消されるはずです。

于 2013-03-12T12:48:39.017 に答える
0

次のように実行できます。

$scope.$watch('[myproperty1,myproperty2,myproperty3]',function(nv,ov){
//do some stuff
});
于 2013-10-12T19:49:48.430 に答える