使用服务器端数据进行Breeze客户端自定义验证

时间:2013-04-19 10:54:39

标签: validation breeze


我创建了一个自定义验证器,用于检查数据库上是否使用了用户名。 验证的整个过程都有效。什么是无效的结果。

function createExistingUsernameValidator() {
        var name = 'existingUsernameValidator';
        var ctx = { messageTemplate: 'Questa partita I.V.A. o codice fiscale sono già stati inseriti.', displayName: "Partita IVA o Codice Fiscale" };
        var val = new Validator(name, valFunction, ctx);

        return val;

        function valFunction(value, context) {
            var result = ko.observable(true);
            require('services/datacontext').getIsUserByUsername(value, result)
                .then(function () {
                    debugger;
                    return !result();
            });
        }
    }

承诺有效:我知道因为它击中了 debbugger 线并且retunrnig值是正确的。
但验证器始终评估为 false ,因为在调用验证器时我没有返回任何内容。换句话说:它不会等待承诺 这是我糟糕的javascript还是其他什么?
欢迎任何帮助。
谢谢!

回答后编辑
我找到了一个涉及Knockout Validation(非常有用的脚本)的解决方案。

    function createIsExistingUserKoValidation() {
        ko.validation.rules['existingUsername'] = {
            async: true,
            validator: function (val, params, callback) {
                if (val) {
                    var result = ko.observable();
                    require('services/datacontext').getIsUserByUsername(val, result)
                        .then(function () {
                            callback(!result());
                        });
                }
            },
            message: ' Existing username.'
        };
        ko.validation.registerExtenders();
    }

在实体创建中:

var createDitta = function () {
        var ditta = manager.createEntity(entityNames.ditta,
            {
                id: newGuid(),
                legaleRappresentante: createPersona(),
                isAttiva: true
            });
        ditta.pivaCodFiscale.extend({ existingUsername: { message: ' Existing username.', params: true } });
        ditta.pivaCodFiscale.isValidating(false);

        return ditta;
    };

ditta.pivaCodFiscale.isValidating(false); 这是必需的,因为isValidating初始化为true。

1 个答案:

答案 0 :(得分:0)

问题是你写的 valFunction 总是会返回'undefined'。 (这是'falsy'。

'return!result()'表达式不是'valFunction'的返回值,它只是执行AFTER valFunction 已经返回的匿名函数的结果。这是承诺的异步性质。

你正在尝试的是编写一个'异步'验证,这个验证不支持Breeze的开箱即用,但这个想法很好。

我认为您可以通过让异步回调实际“设置”实体上的值并使该设置操作本身触发单独的“同步”验证来完成您想要的任务。

这是Breeze更自然地支持的好主意所以请随意向Breeze User Voice添加功能请求,例如“异步验证”。我们使用它来衡量社区对Breeze各种建议功能/扩展的兴趣。