AsyncValidators会一直开火吗?

时间:2017-09-07 17:08:02

标签: javascript html angularjs asynchronous

我正在使用angular.js 1.6.4版本。我为服务器端验证创建了一个指令,我看到它在加载表单时触发,这是错误的。我只想在更改值时触发代码。我的HTML代码是

<div class="col-xs-6">
            <div class="controls">
                <label class="control-label"
                       ng-hide="editRetailTrackingForm.barcode.$dirty && editRetailTrackingForm.barcode.$error">
                    @Labels.barcode:
                </label>
                <input type="text" name="barcode"
                       ng-model="currentItem.barcode"
                       sm-code-unique-validator
                       table-name="items"
                       column-to-test="barcode"
                       error-message="itemBarcodeErrorMessage"
                       primary-key="currentItem.itemId"
                       ng-model-options="{  updateOn: 'blur', debounce: { default : 500, blur: 0 }}"
                       class="form-control"
                       ng-maxlength="100" />
                
                <div ng-class="{loading:editRetailTrackingForm.barcode.$pending}">@String.Format(Messages.validatingX, Labels.barcode)</div>

                <div ng-if="editRetailTrackingForm.barcode.$dirty">
                    <div ng-messages="editRetailTrackingForm.barcode.$error">
                        <div ng-message="maxlength">
                            <label class="field-validation-error control-label-error animate-show">
                                @String.Format(Messages.cannotExceed, Labels.barcode, "100")
                            </label>
                        </div>
                        <div ng-message="smCodeUnique">
                            <div class="info-text-block-error">
                                {{itemBarcodeErrorMessage}}
                            </div>
                        </div>
                    </div>
                </div>
                               

            </div>
        </div>

我的指令代码与http://www.codelord.net/2014/11/02/angularjs-1-dot-3-taste-async-validators/

非常相似

 return {

            require: "ngModel",

            scope: {
                primaryKey: "=?",
                tableName: "@",
                columnToTest: "@",
                errorMessage: "=?"
            },

            link: function ($scope, element, attrs, ngModel) {

                ngModel.$asyncValidators.smCodeUnique = function (modelValue, viewValue) {
                    if (!viewValue) {
                        return true;
                    }

                    let codeObject = {
                        id: $scope.primaryKey, tableName: $scope.tableName,
                        columnToTest: $scope.columnToTest, code: viewValue
                    };
                    return services.Http.put('api/items/checkCodeUniqueness', codeObject).then(
                        function (response) {
                            if (!response.data.isValid) {
                                $scope.errorMessage = response.data.errorMessage;
                                return services.Deferred.reject(response.data.errorMessage);
                            }
                            return true;
                        }
                    );
                };
            }
        };

当我调试我的代码时,我发现当我只实例化我的表单时,服务器端代码运行了多次(甚至没有打开这个字段所在的正确选项卡)。

那么,当我改变价值时,我应该如何将指令或ng-options更改为仅激活验证?

0 个答案:

没有答案