0

我试图ko.dataFor()在一个select元素上使用,但它返回了整个 ViewModel。我期望得到 selected 的对象option,但我总是得到 ViewModel 。我试过通过selectandoption但无论哪种方式我都会得到相同的结果。

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 会更好。创建一个 observable 并将值绑定到选择。然后,您可以使用所选值执行您想要的操作。

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