2017-07-09 28 views
1

オブジェクトをいくつかのフィールドとリストで構成した.Netからモデルをビューモデルに渡しました。それらはそれぞれ別のリストを持ちます。ノックアウト観察可能な観測可能な配列の配列

リストのリストを持つオブジェクトです。

私の見解では、私はこれをいくつかのデータとして、タブのリスト(最初のリスト)で表し、各タブにはデータのグリッドがあります。私のノックアウトビューモデルで

は、私は持っている:

self.Name = ko.observable(""); 
self.Width = ko.observable(0); 
self.Height = ko.observable(0); 

self.TemplateGroups = ko.observableArray(); 

ので、観察可能な配列との私の主な目的、(最初のリスト)。しかし、その中のリストは、観察可能ではありません。

私tablsをレンダリングするときに、私が行います

<div class="tab-content" data-bind="foreach: TemplateGroups"> 

そして、それは、それぞれのタブをレンダリングします。

<tbody data-bind="foreach: $data.Components"> 
     <tr style="cursor: pointer" data-bind="click: $parents[1].ClickedIt"> 

問題は、私のClickIt関数に、私はIdof表示しています、です(「コンポーネント」の外側のリスト内のリストの名前です):そして、それぞれのタブの中に、私はこれを行います行をクリックして、それは動作します。そして私はちょうどこの外リストの「説明」フィールドを変更しようとしていますが...それは決して認められ、機能はありませんん、そう:

self.ClickedIt = function() { 
    alert(this.Id); 
    this.Description("Craig"); 

} 

警告は、IDを示しているが、説明上のエラーは( "クレイグ")、それは機能ではないので。

私のObservableArray内のリストを観測可能にするにはどうすればよいですか?

(私が渡したモデルは、TemplateGroupsというリストを含むオブジェクトで、そのリストの各アイテムには「コンポーネント」という名前のリストが含まれています。私が表示しているコンポーネントですが、そのリストを作成する必要がありますObservable

編集:これは私が探しているものです(http://jsfiddle.net/rniemeyer/bZhCk/)...私は同じ方法で配列を定義していません。彼らは.Netクラスから継承されています(つまり、JSONに変換されています).NetクラスにはListを持つ別の.Netクラスのリストが含まれています。

注マイ負荷方法は:

self.loadData = function() { 
     $.get("/api/PlateTemplate/Get", { id: self.TemplateId() }).done(function (data) { 
      self.Name(data.Description); 
      self.Width(data.Width); 
      self.Height(data.Height); 
      self.TemplateGroups(data.PlateTemplateGroups); 
     }); 
    } 
+1

self.TemplateGroups' 'の内容は観察できません。それらは普通のjavascriptオブジェクトです。おそらく、マッピング・プラグイン(http://knockoutjs.com/documentation/plugins-mapping.html): 'self.TemplateGroups(ko.mapping.fromJS(data.PlateTemplateGroups))'を 'self.loadData '。このようにして、すべてのプロパティが観測可能になります。 –

+0

@JoseLuis - パーフェクト!うわー、ありがとう!それは完璧に働いています。 View Modelのデータを同じ構造に戻したい場合、View Modelを、受け取ったのと同じ構造に、更新された値でマップする方法はありますか?だから、「toSSON」のように?また、あなたが答えを作ることができれば、私はそれを受け入れることができます。ありがとう! (もう一度!) – Craig

答えて

1

self.TemplateGroupsの含有量がdata.PlateTemplateGroupsあり、それは配列であり、その含有量は、観察可能な特性(これらはJavaScriptのオブジェクトである)ではありません。

あなたはこの配列内のこのオブジェクトは観測となり、あなたはMapping Pluginを使用することができることをしたい場合:

self.loadData = function() { 
    $.get("/api/PlateTemplate/Get", { id: self.TemplateId() }).done(function (data) { 
     self.Name(data.Description); 
     self.Width(data.Width); 
     self.Height(data.Height); 
     self.TemplateGroups(
      ko.mapping.fromJS( // <--- new 
      data.PlateTemplateGrou‌​ps)); 
    }); 
} 

この方法は、すべてのプロパティが観測なります。

あなたがko.mapping.toJS()を使用することができ、JSON形式にこのデータを変換する必要がある場合:

ko.mapping.toJS(self.TemplateGroups) 
+0

ありがとう@ジョーズルイス -​​ 退屈なことは問題だと思われる。 ko.mapping.toJS(self)を使用するだけで、ビューモデルのすべてのデータ(リストとリストを含む)がWebAPI関数に戻って、ビューモデルに渡されたのと同じ形式で送信される?それとももう少しやる必要がありますか? toJSメソッドを試してみると、エラーが発生します。それは私のクリック/セーブ機能と戦っている。 – Craig

+0

@Craig私はJSONを送信するとき、私はこれをします: 'var unmapped = ko.mapping.toJS(self); var unmappedJSON = ko.toJSON(マップされていません); 'このコードはViewModelの関数に入ります。これは' self'を使用するためです。 –

+0

これは例です:https://codepen.io/anon/pen/QgzqVe –

関連する問題