私はkoで特にトリッキーな問題を抱えています。いくつかの例について説明しようと思います。
まず、これが私がレンダリングしようとしているhtmlジャンクです。foreach変数「Appliances」は配列であり、viewModelのプロパティです。オプションデータは、ビューモデルのプロパティ配列でもあります。ここでの名前はApplianceTypesです。
<table>
<tbody data-bind="foreach: Appliances">
<tr>
<td>
<select data-bind="options: $root.ApplianceTypes, value: $data.ApplianceType.Id, optionsValue: 'Id', optionsText: 'ApplianceTypeDesc'">
</select>
</td>
<td>
<input data-bind="value: UnitNumber" />
</td>
</tr>
</tbody>
</table>
さて、これを念頭に置いたので、アイデアをもう少しよく記入するためのデータを次に示します。
var viewModel = {
RequestNumber:37,
UnitNumber:3,
Appliances:[{
Id:2,
ApplianceType:{Id:5, ApplianceTypeDesc:"Water Heating Tankless"},
ServiceApplianceQuantity:"1",
}],
ApplianceTypes:[
{Id:5, ApplianceTypeDesc:"Water Heating Tankless"},
{Id:1, ApplianceTypeDesc:"Dryer"},
{Id:2, ApplianceTypeDesc:"Range"},
{Id:3, ApplianceTypeDesc:"Heating"},
{Id:4, ApplianceTypeDesc:"Water Heating"},
{Id:6, ApplianceTypeDesc:"Fireplace"},
{Id:7, ApplianceTypeDesc:"Make Up Air Heating"},
{Id:8, ApplianceTypeDesc:"BBQ"}
]
}
ですから、ここではまだ大きな問題はありません。アプライアンスごとに1行のUIを取得します。各行は、アプライアンスタイプで満たされたタイプドロップダウンです。自分が持っているものを編集しているだけの場合は、viewModel.Appliances [i] .ApplianceType.Idが更新され、生活は良好です。アプライアンス配列にnewを追加しようとすると、applianceType.Idが更新されません。そのためのコードは次のとおりです。
function ApplianceTypeViewModel() {
var self = this;
self.Id = ko.observable("5");
self.ApplianceTypeDesc = ko.observable("");
};
function ApplianceViewModel(applianceType) {
var self = this;
self.Id = ko.observable("-1");
self.ApplianceType = ko.observable(applianceType);
self.ServiceApplianceQuantity:"1"
};
viewModel.AddAppliance = function () {
viewModel.Appliances.push(new ApplianceViewModel(new ApplianceTypeViewModel()));
};
最終的には、applianceTypeをAppliances [i] .ApplianceTypeを介して配列からコピーしておくと便利ですが、正直なところ、IDをそこで更新しようとしています。残りはサーバーで実行できます。
データが存在する場合は、毎回変更されます。(AddApplianceを使用して)新しく作成しても、データは変更されません。
みんな、ありがとう!