少し前に、観察可能なプロパティを拡張して、そよ風のバリデーターに基づく検証を追加するヘルパー関数を投稿しました。そのヘルパーを使用すると、無効な入力で赤い色を実現できます。
そよ風の検証メッセージを翻訳する
2番目の質問についてはお役に立てません。検証メッセージをカスタマイズできることは知っていますが、デフォルトのバリデーターでは、メッセージに表示するわかりやすい名前を設定できないと思います。
アップデート:
私が最初に行うことは、関数(更新されたバージョン)を公開するヘルパーモジュールを作成することです。
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
};
});
次に、各そよ風エンティティタイプの初期化子を定義しています(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
};
});
そして最後に、どこかで(データサービスモジュール内の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();
}
});