我有这个:
<div data-bind="with: storeModel.stores()">
<h1>Store count <span data-bind="text: '(' + $data.length + ')'"></span></h1>
<ul id="stores" data-bind="foreach: $data">
<li data-bind="text: Name, click: $root.storeModel.editStore"></li>
</ul>
</div>
<div id="editStore" data-bind="with: storeModel.currentEditItem()">
<form data-bind="submit: $root.storeModel.saveStore" action="">
<fieldset>
<legend>Foo</legend>
<label for="name">Name:</label>
<input type="text" data-bind="value:Name" id="name" />
<label for="address">Address:</label>
<input type="text" data-bind="value:StreetAddress" id="address" />
<label for="postalcode">Postal code:</label>
<input type="text" data-bind="value:PostalCode" id="postalcode" />
<label for="city">City:</label>
<input type="text" data-bind="value:City" id="city" />
<button style="display:block" type="submit" data-bind="jqButton: $data">Save</button>
</fieldset>
</form>
</div>
p.editStore = function(store, event) {
location.hash = 'Stores/Edit/' + ko.utils.unwrapObservable(store.StoreId);
p.currentEditItem(store);
//Append edit form to li, how?
}
现在,我想在每个li元素上的click事件将编辑表单附加到所述li上。是一个模板,以保持编辑形式在这里一个好主意?否则,我需要为每个li生成编辑表单。
或者是否应该使用绑定处理程序?
主要来自jQuery,处理KO中的UI内容可能会令人困惑。感谢所有答案。
答案 0 :(得分:1)
您可以使用If statement。它会动态地将表单添加到li标签,而不是一直存储在那里。
<li data-bind="text:$data, if: $data == selected ">
答案 1 :(得分:0)
您可以发布剩余的淘汰赛,以便我们可以看到您正在使用的数据模型吗?
以下是我将如何处理这种情况。您基本上将模板绑定到“当前值”。你只需轮流显示/隐藏表单,但总是传递所点击的内容。您的点击处理程序会将单击的项目设置为模板显示的内容,在我的情况下,我只显示对话框。示例(大多数代码,但您可以希望得到一个想法)
<script type="text/x-jquery-tmpl" id="streamTemplate">
<fieldset>
<legend>Information</legend>
<table style="width:100%">
<tr>
<td>
<label>Account: <span data-bind="text:AccountName"></span></label>
</td>
<td>
<label>MAC Address: <span data-bind="text:MAC"></span></label>
</td>
</tr>
<tr>
<td>
<label>Camera Model: <span data-bind="text:CameraModelName"></span></label>
</td>
<td>
<label>Channel: <span data-bind="text:Stream"></span></label>
</td>
<tr>
</table>
</fieldset>
</script>
<div id="dialog" data-bind="template: { name: 'streamTemplate', data: CurrentActivation()}">
</div>
<tbody data-bind="foreach: ActivationCodes">
<tr>
<td>
<label data-bind="text: MAC()">
</label>
</td>
<td>
<label data-bind="text: AccountName()">
</label>
</td>
<td>
<button data-bind="click: $root.Activate">
Activate</button>
</td>
</tr>
<tbody>
<script>
function viewModel() {
var self = this;
self.filter = ko.observable("All");
self.ActivationCode = ko.observable();
self.ActivationCodes = ko.observableArray([]);
self.CurrentActivation = ko.observable(new InactiveCamera("", "", "", "", "", "", "", "", ""));
self.Activate = function (data) {
self.CurrentActivation(data);
$("#dialog").dialog("option", "title", "Activing Streams for: " + data.ActivationCode());
$("#dialog").dialog("open");
$("#dialog button").button();
};
}
function format(date) {
return date.getMonth() + "/" + date.getDay() + "/" + date.getFullYear() + " " + date.toLocaleTimeString();
}
$("#dialog").dialog({
autoOpen: false,
width: 600,
height: 600,
modal: true
});
ko.applyBindings(new viewModel());
</script>