我现在正在创建一个这样的复选框集合。
一些背景:起初我只为整个客户端虚拟机使用 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()
}
我的复选框正确呈现,除了适当的复选框不会在屏幕加载时检查。然后我意识到淘汰赛中的一个问题,我需要将我的选中属性更改为文本。(请参阅我的 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 创建的原始对象中......我现在也不知道该怎么做......有什么想法吗?