0

要素で使用しようとしていますがko.dataFor()selectViewModel 全体を返しています。selected のオブジェクトを取得することを期待していますが、option代わりに常に ViewModel を取得します。と を渡そうとしましselectoptionが、どちらの方法でも同じ結果が得られます。

http://jsfiddle.net/LzAAB/3/

<select id="companies" data-bind="options: companies, optionsText: 'name', optionsValue: 'id', optionsCaption: ' ' "></select>
<br/>
ko.DataFor(select)<br/>
<textarea id="a" cols="40" rows="10"></textarea>
<br/>
ko.DataFor(option)<br/>
<textarea id="b" cols="40" rows="10"></textarea>
<br/>
<div data-bind="text: ko.toJSON($root)"></div>


function MyViewModel() {
    var self = this;
    self.companies = ko.observableArray([{id:1, name: "Chevy"},{id:2, name: "Ford"}, {id:2, name: "Dodge"}]);
    self.countries = ko.observableArray([{id:1, name: "USA"},{id:2, name: "Canada"}, {id:2, name: "Mexico"}]);
}

var vm = new MyViewModel();

ko.applyBindings(vm);

$("#companies").change(function(){    
    $("#a").val("dataFor("+this.id+"):"+  ko.toJSON(ko.dataFor(this)));

    var selectedOption = $(this).find(":selected")[0];
    $("#b").val("dataFor("+this.id+"):"+  ko.toJSON(ko.dataFor(selectedOption)));
});
4

1 に答える 1

4

関数が提供するのko.dataFor()は、要素がバインドされているオブジェクトです。$dataこれは、コンテキスト変数にアクセスした場合にバインディングが参照するオブジェクトと同じです。バインディングによって生成されたオプション要素optionsは同じコンテキストを使用するため、違いはありません。これは、バインディング コンテキストが変更されるバインディングにのみ関連します (たとえば、foreach バインディング)。


jquery に頼るのではなく、knockout の機能を使用して目的のオブジェクトにアクセスした方がよいでしょう。オブザーバブルを作成し、値を選択にバインドします。次に、選択した値で必要なことを行うことができます。

function MyViewModel() {
    var self = this;
    self.selectedCompany = ko.observable();
    self.companies = ko.observableArray(...);
    self.countries = ko.observableArray(...);
}
<select id="companies"
        data-bind="value: selectedCompany,
                   options: companies,
                   optionsText: 'name',
                   optionsCaption: ' '">
</select>
<br/>
Selected<br/>
<textarea cols="40" rows="10" data-bind="text: ko.toJSON(selectedCompany)">
</textarea>

更新されたフィドル

于 2013-02-19T23:15:03.673 に答える