我创建了一个自定义验证器,用于检查数据库上是否使用了用户名。
验证的整个过程都有效。什么是无效的结果。
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。
答案 0 :(得分:0)
问题是你写的 valFunction 总是会返回'undefined'。 (这是'falsy'。
'return!result()'表达式不是'valFunction'的返回值,它只是执行AFTER valFunction 已经返回的匿名函数的结果。这是承诺的异步性质。
你正在尝试的是编写一个'异步'验证,这个验证不支持Breeze的开箱即用,但这个想法很好。
我认为您可以通过让异步回调实际“设置”实体上的值并使该设置操作本身触发单独的“同步”验证来完成您想要的任务。
这是Breeze更自然地支持的好主意所以请随意向Breeze User Voice添加功能请求,例如“异步验证”。我们使用它来衡量社区对Breeze各种建议功能/扩展的兴趣。