わかりました、かなり大量の階層データがあります。
私は1部以上を求めます
次に、機能するドロップダウンリストがあります
<p data-bind="visible: Id">
Race:
<select data-bind="options: $parent.data.Races, optionsText: 'Name' , optionsValue: 'Id', value: RaceId, optionsCaption: 'Choose...'"></select>
</p>
ただし、RaceId を使用して有効な性別を検索するバインディングは、 with バインディングではコンテキストが変化しないため機能しません。
<p data-bind="with: $parent.data.Races()[ RaceId ]">
<pre data-bind="text: ko.toJSON($data,null , 2) "></pre> //debug
Gender:
<select data-bind="options: Genders, optionsText: 'Name' , optionsValue: 'Id', value: $parent.Gender, optionsCaption: 'Choose...'"></select>
</p>
コンテキストの変更に失敗することに注意してください。すべてが監視可能です。
関数でこれを行うことを考えましたが、raceId が変更されたときに変更する必要があるため、少し注意が必要です (そして、raceId が設定されていない場合は、非表示または空のリストになります)。
どんな助けでも大歓迎です。
これが私の現在の関数の試みです(そして、はい、javascriptは初めてです)が、withバインディングははるかにエレガントです。
self.getGenderForRace = ko.computed( function () {
if ( this && this.data) {
return this.data.Races()[this.RaceId].Genders;
} else {
return new Array();
}
deferEvaluation: true;
}, this);
これは私のビューモデルの一部です
l6.CreateViewModel = function (options) {
var self = this;
//this.getGenderForRace = ko.computed(function (character) {
// return this.data.Races()[character.RaceId].Genders;
//}, this);
self.getGenderForRace = ko.computed( function () {
if ( this && this.data) {
return this.data.Races()[this.RaceId].Genders;
} else {
return new Array();
}
deferEvaluation: true;
}, this);
self.setData = function (url, raceId, factionId, viewmodel) {
$.getJSON(url, { raceId: raceId, factionId: factionId }, function (data) {
viewmodel.data = ko.mapping.fromJS(data.Data);
ko.applyBindings(viewmodel); // we dont bind till we get data
// add to strcture and map!
//self.data = data.Data;
$("#tabContainer").tabs();
});