2

数値を格納する Amount という がありますko.observable。特定の上限で数値量を制限する方法が必要です (上限値は、同じ ViewModel 内のMaxと呼ばれるによって提供されます)。ユーザーがMaxを超えるAmountの値を入力しようとすると、取得したい超過分を別の Overage に適用し、Amountの値がMaxの値を超えないようにします。これはどのように達成できますか?ko.computedko.observable

4

1 に答える 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 で上限に達し、追加を次のように渡します。超過。overagemax

あなたの見解では、これを次のように使用できます-

<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>

http://jsfiddle.net/DNxHu/

それを拡張してサブスクライブし、計算されたものを使用しないなど...フィドルを確認してください

于 2013-10-22T14:17:37.640 に答える