我正在学习淘汰赛,Durandal和Breeze,感谢来自John Papa的 JumpStart SPA视频,这是一种乐趣。所以我检查了这个项目的代码,现在我正在尝试更改验证机制。
此时,保存更改时,如果保存失败,我们会收集错误并显示一个包含错误恢复的祝酒词。
我想要达到的目标是:
能够在视图中标记红色(背景色)无效的字段
当显示toast并且验证错误恢复时(例如:'保存失败:需要affairNr')我想用更友好的名称替换属性名称(类似'保存失败:事件'号码是必需的')
以下是datacontext.js中验证的部分代码:
var saveChanges = function () {
return manager.saveChanges()
.then(saveSucceeded)
.fail(saveFailed);
function saveSucceeded(saveResult) {
log('Saved data successfully', saveResult, true);
}
function saveFailed(error) {
var msg = 'Save failed: ' + getErrorMessages(error);
logError(msg, error);
error.message = msg;
throw error;
}
};
function getErrorMessages(error) {
var msg = error.message;
if (msg.match(/validation error/i)) {
return getValidationMessages(error);
}
return msg;
}
function getValidationMessages(error) {
try {
//foreach entity with a validation error
return error.entitiesWithErrors.map(function (entity) {
// get each validation error
return entity.entityAspect.getValidationErrors().map(function (valError) {
// return the error message from the validation
return valError.errorMessage;
}).join('; <br/>');
}).join('; <br/>');
}
catch (e) { }
return 'validation error';
}
有人能指出我正确的方向吗?
提前致谢。
编辑:
重现问题:点击Transports + recherche avancee左侧边栏+右侧列表+中的任何项目:清除一些输入(如下面的截图Numero d'affaire),然后点击'Enregistrer'。然后调用保存按钮。在那里,我需要检查ko.validation.group是否存在无效输入,但它不起作用。
答案 0 :(得分:8)
前段时间,我发布了一个辅助函数,它扩展了可观察的属性,以便根据breeze验证器添加验证。使用该助手可以在无效输入上实现红色:
Translate breeze validation messages
我无法帮助您解决第二个问题,我知道您可以自定义验证消息,但我认为使用默认验证器您无法在消息上设置友好名称。
更新
我要做的第一件事是创建一个公开函数的辅助模块(更新版本):
define([],
function () {
"use strict";
var foreignKeyInvalidValue = 0;
function addValidationRules(entity) {
var entityType = entity.entityType,
i,
property,
propertyName,
propertyObject,
validators,
u,
validator,
nValidator;
if (entityType) {
for (i = 0; i < entityType.dataProperties.length; i += 1) {
property = entityType.dataProperties[i];
propertyName = property.name;
propertyObject = entity[propertyName];
validators = [];
for (u = 0; u < property.validators.length; u += 1) {
validator = property.validators[u];
nValidator = {
propertyName: propertyName,
validator: function (val) {
var error = this.innerValidator.validate(val, { displayName: this.propertyName });
this.message = error ? error.errorMessage : "";
return error === null;
},
message: "",
innerValidator: validator
};
validators.push(nValidator);
}
propertyObject.extend({
validation: validators
});
}
for (i = 0; i < entityType.foreignKeyProperties.length; i += 1) {
property = entityType.foreignKeyProperties[i];
propertyName = property.name;
propertyObject = entity[propertyName];
validators = [];
for (u = 0; u < property.validators.length; u += 1) {
validator = property.validators[u];
nValidator = {
propertyName: propertyName,
validator: function (val) {
var error = this.innerValidator.validate(val, { displayName: this.propertyName });
this.message = error ? error.errorMessage : "";
return error === null;
},
message: "",
innerValidator: validator
};
validators.push(nValidator);
}
propertyObject.extend({
validation: validators
});
if (!property.isNullable) {
//Bussiness Rule: 0 is not allowed for required foreign keys
propertyObject.extend({ notEqual: foreignKeyInvalidValue });
}
}
}
}
return {
addValidationRules: addValidationRules
};
});
然后,我正在为每个breeze实体类型(http://www.breezejs.com/documentation/extending-entities)定义一个初始值设定项。例如:
define(['app/validatorHelper', 'knockout'],
function (vHelper, ko) {
"use strict";
var constructor = function () {
},
initializer = function indicadorInitializer(entity) {
vHelper.addValidationRules(entity);
};
return {
constructor: constructor,
initializer: initializer
};
});
最后,某个地方(我在我的dataservice模块中的init函数上做),我正在注册初始化器(http://www.breezejs.com/documentation/extending-entities):
//store comes from: manager = breezeconfig.createManager(),
// store = manager.metadataStore,
store.registerEntityTypeCtor("Palanca", domain.palanca.constructor, domain.palanca.initializer);
我在获取元数据之前就已经完成了所有这些工作。
我希望这会对你有所帮助。
更新2:
我发现了问题,您的淘汰验证版本不是最后一个。
在下列文件中:http://ericmbarnard.github.com/Knockout-Validation/,行:349为:
exports.rules[ruleName] = ruleObj;
在文件中,等效行(函数addAnonymousRule)为:
ko.validation.rules[ruleName] = {
validator: ruleObj.validator,
message: ruleObj.message || 'Error'
};
我认为最新的版本应该有用。
更新4:
这是要保存的代码:
vmAddPalanca.prototype.saveChangesCmd = ko.asyncCommand({
execute: function (palanca, complete) {
var validationErrors = ko.validation.group(palanca);
if (validationErrors().length === 0) {
dataservice.saveChanges()
.then(saveChangesSuccess)
.fail(saveChangesFail)
.fin(complete);
} else {
validationErrors.showAllMessages(true);
toastr.error("Debe corregir los errores antes de poder guardar");
complete();
}
},
canExecute: function (isExecuting) {
return !isExecuting && dataservice.hasChanges();
}
});