web-dev-qa-db-ja.com

ドロップダウン変更で観測可能な値を変更するノックアウトJs

私はこのドロップダウンを持っており、車両が新品か中古かを選択できます。

<select name="VehicleType" id="vehicleTypeDropdown" data-bind="value: VehicleType">    
    <option value="New" selected="selected">Nuevo</option>
    <option value="Used">Usado</option>
</select> `

そしてこの入力:

<input type="text" name="Mileage" data-bind="disable: VehicleType() === 'New',value:  Mileage" class="input-large"> `

選択したドロップダウンの値が「新規」の場合、入力を無効にする必要があり、使用する場合は入力を有効にする必要がありますが、値を入力すると、オブザーバブルがこの値を取得し、ドロップダウン値を「新規」に変更すると、オブザーバブルはゼロになる必要があります。

11
Overmachine

ビューモデルの手動サブスクリプションは、このようなものを処理するための良い方法です。サブスクリプションは次のようになります。

this.VehicleType.subscribe(function(newValue) {
    if (newValue === "New") {
        this.Mileage(0);
    }
}, this);

これを使用したサンプルは次のとおりです。 http://jsfiddle.net/rniemeyer/h4cKC/

HTML:

<select name="VehicleType" id="vehicleTypeDropdown" data-bind="value: VehicleType">
    <option value="New" selected="selected">Nuevo</option> 
    <option value="Used">Usado</option> 
</select>

<input type="text" name="Mileage" data-bind="disable: VehicleType() === 'New', value: Mileage" class="input-large">
<hr/>

<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>

JS:

var ViewModel = function() {
    this.VehicleType = ko.observable();
    this.Mileage = ko.observable();

    this.VehicleType.subscribe(function(newValue) {
        if (newValue === "New") {
            this.Mileage(0);
        }
    }, this);
};

ko.applyBindings(new ViewModel());
22
RP Niemeyer

koマッピングプラグイン を使用している場合は、新しいオブジェクトの作成をインターセプトして、そこでサブスクリプションを設定できます。アイテムの全リストがあり、何かが変更されたときにアクションを実行したい場合。

これは、ショッピングカートの広告申込情報(qtyskudescriptionpriceなどのプロパティ)のビューモデルです。

// View Model for an item in my shopping cart
var CartItemViewModel = function(data) 
{
    // map all the properties
    // we could map manually if we want, but that's the whole point of
    // the mapping plugin that we don't need to
    ko.mapping.fromJS(data, {}, this);

    // subscribe to qty change
    this.qty.subscribe(function (newValue)
    {
        alert('qty now ' + this.qty());
        // UpdateCart()

    }, this);    

    // add computed observables if needed
    // ....
}

マッピングプラグインを使用してモデルを更新(または作成)するときは、「items」というプロパティに対して、指定した「create」関数を使用して配列の各要素を作成するように指定します。

    var mapping =
    {
        'items':
        {
            // map cart item 
            create: function (options)
            {
                return new CartItemViewModel(options.data);
            }
        }
    };

    var data = ......  // get your data from somewhere

    // update the CartViewModel using the mapping rules
    ko.mapping.fromJS(data, mapping, rrvm.CartViewModel);
1
Simon_Weaver