0

私が構築している最近のKnockoutインターフェースで、自動保存を設定しようとしました。変更を停止してから1秒後に保存が行われるように設計されています。

ここに問題があります。デフォルトでは、KOは入力のblurイベントに依存してviewModelを更新します。箱から出してクリックする前にページを離れたりブラウザを更新したりすると、私のインターフェースはデータを保存しません。

これを解決するためにvalueUpdate: 'afterkeydown'、すべての文字列入力で機能するを有効にしました。ただし、常に数値が含まれるように拡張された数値のPricePerLFフィールドがあります。ここにある推奨エクステンダーを使用しました。

ko.extenders.numeric = function(target, precision) {
    //create a writeable computed observable to intercept writes to our observable
    var result = ko.computed({
        read: target,  //always return the original observables value
        write: function(newValue) {
            var current = target(),
                roundingMultiplier = Math.pow(10, precision),
                newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue),
                valueToWrite = Math.round(newValueAsNum * roundingMultiplier) / roundingMultiplier;

            //only write if it changed
            if (valueToWrite !== current) {
                target(valueToWrite);
            } else {
                //if the rounded value is the same, but a different value was written, force a notification for the current field
                if (newValue !== current) {
                    target.notifySubscribers(valueToWrite);
                }
            }
        }
    });

    //initialize with current value to make sure it is rounded appropriately
    result(target());

    //return the new computed observable
    return result;
};

この数値エクステンダーをどのようにうまく機能させることができますvalueUpdate: 'afterkeydown'か?2.80また、の代わりに、などの特定の数の小数点を表示するように強制することもできます2.8

4

1 に答える 1

0

私はこのエクステンダーをしばらく前に作成し、afterkeydown で試してみましたが、まともに動作します。

http://jsfiddle.net/yEgmT/1/

ko.extenders.numeric = function(observable, format) {
    return ko.computed({
        read: function() {  
            return Globalize.format(observable(), format === true ? undefined : format);
        },
        write: function(value) {           
            if(value.substring) {
                value = Globalize.parseFloat(value)
            }                    
            if(!isNaN(value)) {
                observable(value);
            }
        }
    });
};
于 2013-01-23T18:39:32.897 に答える