0


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

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();
            });
        }
    }

承诺有效:我知道是因为它到达了调试器行并且retunrnig值是正确的。
但是验证器总是评估为,因为当验证器被调用时我没有返回任何东西。换句话说:它不会等待承诺。
是我的坏 javascript 还是别的什么?
欢迎任何帮助。
谢谢!

回答后编辑
我找到了一个涉及淘汰赛验证(非常有用的脚本)的解决方案。

    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 初始化的。

4

1 回答 1

0

问题是您所写的valFunction将始终返回“未定义”。(这是“假的”。

'return !result()' 表达式不是 'valFunction' 的返回值,它只是在valFunction已经返回之后执行的匿名函数的结果。这就是 Promise 的异步特性。

您正在尝试编写一个“异步”验证,Breeze 不支持开箱即用,但这个想法是个好主意。

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

这是 Breeze 更自然地支持的一个好主意,因此请随时向Breeze 用户语音添加功能请求,以实现“异步验证”之类的功能。我们使用它来衡量社区对 Breeze 的各种提议功能/扩展的兴趣。

于 2013-04-19T17:09:26.583 回答