数値を格納する Amount という がありますko.observable
。特定の上限で数値量を制限する方法が必要です (上限値は、同じ ViewModel 内のMaxと呼ばれるによって提供されます)。ユーザーがMaxを超えるAmountの値を入力しようとすると、取得したい超過分を別の Overage に適用し、Amountの値がMaxの値を超えないようにします。これはどのように達成できますか?ko.computed
ko.observable
1 に答える
0
正確に何を達成しようとしているかに応じて、ほとんどの場合、オブザーバブルを拡張できます。これはあなたに良い方向性を与えるはずです(まだテストするためにフィドルに落としていません)-
ko.extenders.overage = function(target, max) {
target.overage = ko.observable();
var result = ko.computed({
read: target,
write: function(newValue) {
var current = target(),
valueToWrite = newValue > max ? max : newValue
if (valueToWrite === max) {
target.overage(current - max);
target(valueToWrite);
} else {
target.notifySubscribers(valueToWrite);
}
}
});
result(target());
return result;
};
function AppViewModel(one) {
this.myNumberOne = ko.observable(one).extend({ overage: 500 });
}
ko.applyBindings(new AppViewModel(221.2234));
これで、オブザーバブルには、拡張時に設定された追加量(この場合は 500) に対してmyNumberOne
呼び出される拡張プロパティがあり、myNumberOne または拡張するその他のオブザーバブルの値は 500 で上限に達し、追加を次のように渡します。超過。overage
max
あなたの見解では、これを次のように使用できます-
<span data-bind="text: myNumberOne"></span>
<!-- ko if: myNumberOne().overage -->
Overage amount - <span data-bind="text: myNumberOne().overage"></span>
<!-- /ko -->
また
<span data-bind="text: myNumberOne"></span>
<div data-bind="text: $data.myNumberOne().overage"></div>
それを拡張してサブスクライブし、計算されたものを使用しないなど...フィドルを確認してください
于 2013-10-22T14:17:37.640 に答える