ユーザーに警告するために、ノックアウト グリッドのすべての数値列が負の場合は赤色にする必要があるという要件を取得しました。
標準のバインディングを使用することもできますが、ビューモデルとビューに多くのコードが追加されます。
私はノックアウト検証フレームワークを使用しており、エクステンダーを使用して検証を追加しています。
同じことをしたいのですが、エクステンダーの例を見てきましたが、ビューに要素を追加する必要があります.どういうわけか、検証フレームワークはエクステンダーのみで機能します.どうすれば同じことができますか? 私の目標は、警告を追加するためにこのようなものだけを必要とすることです
this.accountBalance = ko.observable(data.AccountBalance).extend({ warnIfNegative: true });
更新:検証フレームワークを見た後にこれを行いました。気に入らないのは、各バインディングをオーバーライドして機能させる必要があることです。たとえば、テキストと値のバインディングの両方にこれが必要です
(function () {
ko.extenders.negativeValueWarning = function (target, option) {
target.hasWarning = ko.observable();
function warn(newValue) {
target.hasWarning(newValue < 0 ? true : false);
}
warn(target());
target.subscribe(warn);
return target;
};
var init = ko.bindingHandlers.text.init;
ko.bindingHandlers.text.init = function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
if (init)
init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
var value = valueAccessor();
if (value.hasWarning) {
ko.applyBindingsToNode(element, { negativeValueWarning: value.hasWarning });
}
};
ko.bindingHandlers.negativeValueWarning = {
update: function (element, valueAccessor) {
var warn = ko.utils.unwrapObservable(valueAccessor());
if (warn)
$(element).addClass("negative-warning");
else
$(element).removeClass("negative-warning");
}
};
} ());