【发布时间】:2015-12-05 13:20:59
【问题描述】:
我是 KnockoutJS 的新手,在理解使用 Knockout 数据绑定的最佳方法时遇到了一些问题。 Fiddle
我当前的项目使用一个对话框弹出窗口来填充诸如值表之类的内容。但目前,我只通过将值推送到 Knockout observableArray 来将值从对话框复制到表中。必须有一种方法可以进一步简化这个过程(我至少还有 8 个以上这些类型的对话框,有些有 15 个以上的字段!)
<h4>Affiliations</h4>
<table id="AffiliationsTable" data-bind="foreach: affiliations">
<thead>
<tr>
<td>Organization Name</td>
<td>Affiliation Role</td>
</tr>
</thead>
<tr>
<td>
<input data-bind="value: OrganizationName, attr: {name: 'Affiliations[' + $index() + '].OrganizationName'}">
</td>
<td>
<input data-bind="value: AffiliationRole, attr: {name: 'Affiliations[' + $index() + '].AffiliationRole'}">
</td>
</tr>
</table>
<div id="dialogAffiliation" data-bind="dialog: {autoOpen: false, title: 'Affiliation' }, dialogVisible: isOpen">
<label for="OrganizationName">Organization Name</label>
<input type="text" name="OrganizationName" value="" class="text ui-widget-content ui-corner-all" id="OrganizationNameInsert">
<label for="AffiliationRole">Affiliation Role</label>
<input type="text" name="AffiliationRole" value="" class="text ui-widget-content ui-corner-all" id="AffiliationRoleInsert"><br />
<button data-bind="click: addAffiliation">Save</button>
</div>
<div>
<button data-bind="click: open">Add Affiliations</button>
</div>
希望 KO 代码可以做出最大的改变,但我似乎想不出改进的地方。也许用一个可观察的填充对话框,该可观察对象在保存单击时移动到表 DOM。或者比这更聪明的东西。任何建议将不胜感激!
var viewModel = function() {
var self = this;
self.isOpen = ko.observable(false);
self.open = function () {
this.isOpen(true);
};
self.close = function () {
this.isOpen(false);
};
self.affiliations = ko.observableArray([
{ OrganizationName: ko.observable('name'), AffiliationRole: ko.observable("role")}, { OrganizationName: ko.observable('name2'), AffiliationRole: ko.observable("role2") }
]);
self.addAffiliation = function () {
self.affiliations.push({ OrganizationName: document.getElementById("OrganizationNameInsert").value, AffiliationRole: document.getElementById("AffiliationRoleInsert").value });
$("#dialogAffiliation").dialog('close');
};
};
ko.applyBindings(new viewModel());
【问题讨论】:
-
不是您要求的解决方案,但为什么不简单地将空白字段添加到屏幕上呢?您可以完全绕过打开模式,并且这些字段仍然可以编辑。更少的点击,更好的用户界面 (imo)。
-
A.老板想要这样。 B. 某些字段将仅转换为文本(在单击之前不可编辑)。
-
好吧...如果必须,您可以创建一个代表您的表单/对象的模型。然后,使用 KOMapping 插件,您可以将数据映射到该对象的新实例并将其添加到您的集合中。
-
我添加了一个答案。我所在的团队使用 KO 将模型从客户端传递到服务器(反之亦然)。它可能需要一些尝试,但是能够传递数据的 JSON 表示形式,然后将它们转换为 observables、js 对象或服务器模型,背后有相当大的力量。
标签: javascript jquery asp.net asp.net-mvc knockout.js