【发布时间】:2014-08-20 14:30:15
【问题描述】:
我遇到了以下问题:我有一个项目列表,用户可以单击其中的任何一个进行编辑。此时,将显示一个引导模式对话框,其中包含每个可编辑值的字段。我正在从底层 Knockout 视图模型中更新字段的值,因此当用户在模式对话框上编辑项目时,他们可以在后台看到正在修改的字段。因此,修改当前工作正常。但是,当对话框第一次打开时,它没有来自用户选择的项目的值;相反,它具有先前加载的值。但是,当用户开始编辑一个字段时,它会立即更新为应有的值,并允许用户继续编辑正确的字段。不知道这里发生了什么。
这是我的模态:
<script id="myModal" type="text/html">
<div class="modal-header">
<button type="button" class="close" data-bind="click: close" aria-hidden="true">×</button>
<h3 data-bind="html: header"></h3>
</div>
<div class="modal-body">
<div class="form-group">
<label>First Name</label>
<input type="text" data-bind="value: modal.firstName, valueUpdate: 'afterkeydown'" class="form-control" />
<label>Last Name</label>
<input type="text" data-bind="value: modal.lastName, valueUpdate: 'afterkeydown'" class="form-control" />
<label>Phone</label>
<input type="text" data-bind="value: modal.phone, valueUpdate: 'afterkeydown'" class="form-control" />
<label>Email</label>
<input type="text" data-bind="value: modal.email, valueUpdate: 'afterkeydown'" class="form-control" />
</div>
</div>
<div class="modal-footer">
<a href="#" class="btn" data-bind="click: close, html: closeLabel"></a>
<a href="#" class="btn btn-primary" data-bind="click: action, html: primaryLabel"></a>
</div>
</script>
<!-- Create a modal via custom binding -->
<div data-bind="bootstrapModal: modal" data-keyboard="false" data-backdrop="static"></div>
这是通过淘汰赛填充列表的部分:
<ul data-bind="foreach: tasks">
<li>
<div style="border:double">
<div>
<label data-bind="text: firstName"></label>
</div>
<div>
<label data-bind="text: lastName"></label>
</div>
<div>
<label data-bind="text: phone"></label>
</div>
<div>
<label data-bind="text: email"></label>
</div>
<div>
<button data-bind="click: editI.bind(this)">Edit</button>
@*<button data-bind="click: $parent.removeUser">Delete</button>*@
</div>
</div>
</li>
</ul>
<form @*data-bind="submit: addUser"*@>
<button type="submit">Add User</button>
</form>
<button @*data-bind="click: save"*@>Save</button>
这里是我设置模态值的地方,当敲除视图模型被加载时,它会起作用:
viewModel.modal = {
header: ko.observable("This is a modal"),
firstName: ko.observable("a"),
lastName: ko.observable("a"),
phone: ko.observable("a"),
email: ko.observable("a"),
body: ko.observable("test body"),
closeLabel: "Close",
primaryLabel: "Do Something",
show: ko.observable(false), /* Set to true to show initially */
onClose: function () {
viewModel.onModalClose();
},
onAction: function () {
viewModel.onModalAction();
}
最后,这里是打开模式时调用的编辑函数。这就是事情出错的地方。项目元素被设置为模态视图模型,但在用户开始编辑该项目之前不会显示在模态中......然后,bam,项目显示在字段中。
self.editI = function (item) {
viewModel.modal.body = item.email;
viewModel.modal.firstName = item.firstName;
viewModel.modal.lastName = item.lastName;
viewModel.modal.phone = item.phone;
viewModel.modal.email = item.email;
prevState = item;
viewModel.modal.show(true);
注意:我发现了一些与此类似的 SO 帖子: how to destroy bootstrap modal window completely? 但他们并没有真正提供帮助。
【问题讨论】:
标签: javascript jquery twitter-bootstrap knockout.js