現在、このようなチェックボックスのコレクションを作成しています。
いくつかのコンテキスト: 最初は、クライアント側 VM 全体に ko.mapping プラグインを排他的に使用していました。
たとえば、私のコードのコンテキストでは:
self.AllAgencyTypes = ko.mapping.fromJS([]);
self.observables = { //this would be created by the mapping plugin on render/runtime
SomeProperty: ko.observable(),
AgencyTypes: ko.observableArray()
}
画面の読み込み時に適切なチェックボックスがチェックされないことを除いて、チェックボックスが正しくレンダリングされました。その後、checked 属性をテキストに変更する必要があるノックアウトの問題に気付きました。(私の get ajax 呼び出しの成功を参照してください)
HTML
<tbody data-bind="foreach: AllAgencyTypes">
<tr>
<td>
<label class="checkbox inline">
<input type="checkbox" class="editorField" data-bind="attr: { value: Id },
checked: $root.SelectedAgencies" />
<span class="editorField" data-bind="text: Name"></span>
</label>
</td>
</tr>
</tbody>
ビューモデル
AgencyDetailsVM: function (options) {
var self = this;
self.AllAgencyTypes = ko.mapping.fromJS([]);
//added this to get past the check-box bug
self.SelectedAgencies = ko.observableArray([]);
// CRUD Actions
self.get = function () {
$.ajax({
url: options.getURL,
dataType: 'json',
success: function (result) {
self.observables = ko.mapping.fromJS(result);
//convert to string array
self.SelectedAgencies($.Enumerable.From(result.AgencyTypes)
.Select(function (x) {
return x.Id.toString();
}).ToArray()
);
ko.applyBindings(self, $('form')[0]);
}
});
$.getJSON(options.getAgencyTypes, function (response) {
ko.mapping.fromJS(response, self.AllAgencyTypes);
});
};
}
私の現在の問題は、保存送信にあります。チェックボックスは新しく作成された監視可能な配列にバインドされているため、サーバー側のモデルにはバインドされていません。
$.ajax({
url: options.editURL,
data: self.observables,
type: "post",
dataType: "json", ....
})
このようなことができれば... 問題が解決するかもしれないという考えがあります...しかし、方法がわかりません。(許可されていない.stringの取得/何かエラーATM。)
<input type="checkbox" class="editorField" data-bind="attr: { value: Id },
checked: $root.observables.AgencyTypes.Id.toString()" />
したがって、私が利用できる唯一のオプションは、コレクションを ko.mapping によって作成された元のオブジェクトにプッシュすることです...これも現時点では方法がわかりません...アイデアはありますか?