2016-11-12 4 views
0

私は多くのネストされたオブジェクトとネストされたオブジェクトのコレクションを持つKOモデルを持っています。 ko.mappingsマッピングオプションを使用して、モデル作成中に正しく生成されるようにしますが、値はクリアされます。メニューダウン簡単なドロップを開始し、それにオブジェクトをバインドしようとすると:ノックアウトマッピング:ネストしたオブジェクトから適用バインディングで値がクリアされるのはなぜですか?

<select id="myList" name="SelectedSurvey" id="SelectedSurvey" class="form-control" 
data-bind="options: AvailableSurveys, optionsText: 'Name', value: SelectedSurvey, 
optionsCaption: '-- Select Survey --'"></select> 

次に、ページ上の新しいオブジェクトを作成する際に、いくつかのデータを取り、それが正常に動作しますが、から既存のレコードを編集しようとしたとき同じページでは、ドロップダウン値は決して選択されません。私がviewModel.SelectedSurvey() the value is undefined, but it only becomes undefined after I call applyBindings()をチェックするとき。なぜこうなった?どうすれば修正できますか?ここで

は実施例である:http://jsfiddle.net/6wLcr52y/3/

コンソールを開いて、それを実行した場合、あなたはapplyBindings()前にログがいっぱいViewModelに呼び出され、ネストされたオブジェクトSelectedSurvey()が適切な値を持つオブジェクトをkomappingされ表示されますそれが呼び出された後です。 SelectedSurvey()は未定義となり、そのように私のドロップダウンリストには決して選択された値がありません。

答えて

0

SelectedValueパラメータは、オブジェクトを有効な値として受け入れたくないようです。したがって、有効な値が指定されていないと考えてバインディングを適用するとすぐにSelectedValueオブザーバブルをクリアします。

回避策として、optionsValueパラメータを使用して、値として 'Id'プロパティを受け入れるソリューションを作成しました。これにより、Surveyオブジェクト全体ではなく、単に「Id」値を渡すことで、選択された測量が制御されるようになります。

これには、ノックアウトバージョンを3.4.0に更新する必要があります。何らかの理由で2.2.1を使用することに拘束されていますか?

さらに、マッピングプラグインの読みやすい実装を組み込むようにjsfiddleを更新しました。うまくいけば、これはあなたの問題を解決します:

var ViewModel = function(data) { 
    var self = this; 
    self.AvailableSurveys = ko.mapping.fromJS(data.AvailableSurveys); 
    self.SelectedId = ko.observable(data.SelectedSurvey.Id); 
    self.SelectedSurvey = ko.pureComputed(function() { 
     for (i = 0; i < self.AvailableSurveys().length; i++) { 
      if (self.AvailableSurveys()[i].Id() === self.SelectedId()) { 
       return self.AvailableSurveys()[i]; 
      } 
     } 
    }) 
} 

フィドル:http://jsfiddle.net/dw1284/v1L5tw6h/3/

+0

これは動作しますが、私はKO /作品をko.mappingどのようにしてはかなりイライラしています。最初に値を指定するかどうかにかかわらず、作成と編集の機能に違いがあります。私はいつでもネストされたオブジェクトまたはネストされたオブジェクトのコレクションが初期化しようとしているときにこの問題を抱えています。例えば、このフィドルをチェックしてください:http://jsfiddle.net/6wLcr52y/6/ subscribeメソッドでは、selectedSurveyはロード時に設定されませんが、ドロップダウンを変更して選択した場合はうまく動作し、全体を設定しますオブジェクト。 – SventoryMang

+0

マッピングプラグインを使用するかどうかを明確にする必要があると思います。プレーンオブザーバブルとko.mapping.fromJSの両方を使用するためです。私はその部分が私を台無しにしていると思う。私の通常の経験では、ネストされたオブジェクトを使用して、サブスクライブするメソッドをそれらに追加するとき、レコードを編集するとき、 "SelectedSurveyは関数ではありません"というエラーメッセージが表示されます。ネストされたオブジェクトがオリジナルのフィドルのようにあまりにも購読された場合。私は、マッピングプラグインがそれを十分にラップしていないため、すべてのプロパティがマッピングプロパティ(ko_mapping_プロパティを持つようにラップする)でなければならないと考えました。 – SventoryMang

+0

マッピングプラグインを使用する必要があるのは、子プロパティをobservable自身にする必要があるときだけです。たとえば、調査の名前をオンザフライで更新する予定で、更新された名前をGUIに反映させるには、マッピングプラグインを使用してself.AvailableSurveysオブジェクトを生成する必要があります。私がself.SelectedIdプロパティのためにプレーンオブザーバブルを使用した理由は、Idフィールドにはobservablesに変換する子がないため、マッピングプラグインを使用するのは意味がないからです。 –

関連する問題