0

わかりました、かなり大量の階層データがあります。

私は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();

    });
4

3 に答える 3

1

私のプロジェクトのようにデータを分割した場合、各選択に応じて ajax 呼び出しを行う必要があります。これを行う方法の例を次に示します。

http://jsfiddle.net/Zholen/h7j3f/

于 2012-10-17T19:37:03.620 に答える
0

これは、探していることを実行する方法を示す実用的なフィドルです: http://jsfiddle.net/jearles/Q8kcs/

IDをいじっている理由はありますか?select を使用すると、値バインディングは選択されたオブザーバブル全体を保存できます。これにより、利用可能なサブオプションに簡単にアクセスできます。

于 2012-10-17T10:47:49.023 に答える
0

を含めたい場合はdeferEvaluation: true、オプションとして次のように渡す必要がありますko.computed

self.getGenderForRace = ko.computed({
    read: function() {
        if ( this && this.data) {
            return this.data.Races()[this.RaceId].Genders;
        } else {
            return [];
        }
    },
    deferEvaluation: true
}, this);
于 2012-10-17T10:36:10.693 に答える