use*_*592 3 javascript jquery knockout.js asp.net-mvc-5
我有一个表有四列,即代码,名称,数量和价格.其中,我想动态更改Quantity列的内容/元素.通常,它应该显示元素中显示的数量,当用户点击元素时,我想显示元素,以便用户可以编辑数量.我正试图在这个淘汰文档链接上按照"示例2"实现.
以下是我的代码:
页面视图模型
function OrderVM (vm) {
var self = this;
self.OrderNo= ko.observable(vm.OrderNo());
.....
.....
self.OrderedProducts = ko.observableArray([]);
for (i = 0; i < vm.OrderedProducts().length; i++) {
var p = new ProductVM(vm.OrderedProducts()[i]);
self.OrderedProducts.push(p);
}
.....
}
function ProductVM(vm) {
var self = this;
self.Code = ko.observable(vm.Code());
self.Name = ko.observable(vm.Name());
self.Quantity = ko.observable(vm.Quantity());
self.Price = ko.observable(vm.Price());
self.IsEditing = ko.observable(false);
this.edit = function () {
self.IsEditing(true);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的Razor视图中,我有以下代码:
<tbody data-bind="foreach:OrderedProducts">
<tr>
<td class="lalign"><span data-bind="text:Code"/></td>
<td class="lalign"><span data-bind="text:Name" /></td>
<td class="ralign" style="padding:1px!important;">
<span data-bind="visible: !IsEditing(), text: Quantity, click: edit"
style="width:100%;float:left;text-align:right;padding-right:10px;" />
<input data-bind="value: Quantity,visible:IsEditing,hasfocus:IsEditing"
style="width:100%;text-align:right;padding-right:10px;" />
</td>
<td class="ralign rightbordernone" style="padding-right:20px!important;"><span data-bind="text:Price"/></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,当我单击表的Quantity列中的span元素时,调用"edit"函数并将"IsEditing"值设置为true,但我看不到输入元素在我的单元格中可见.单击span元素后,如果我使用"Inspect Element"查看html,我仍然只能看到元素而不是在我的视图中的屏幕上,我既看不到span也没有输入元素.
这是非常简单的逻辑并按预期执行,但是视图上的最终结果不是预期的.任何人都可以帮我检测上面的代码有什么问题吗?
问题很棘手.它位于一个事实,即span是不是一个自我封闭的元素.这将有效:
<td>
<span data-bind="visible: !IsEditing(), text: Quantity, click: edit"></span>
<input data-bind="value: Quantity, visible: IsEditing, hasfocus: IsEditing" />
</td>
Run Code Online (Sandbox Code Playgroud)
这是一个完整的演示:
function ProductVM(vm) {
var self = this;
self.Code = ko.observable(vm.Code());
self.Name = ko.observable(vm.Name());
self.Quantity = ko.observable(vm.Quantity());
self.Price = ko.observable(vm.Price());
self.IsEditing = ko.observable(false);
this.edit = function () {
self.IsEditing(true);
}
}
ko.applyBindings({ OrderedProducts: [new ProductVM({
Code: function() { return 1; },
Name: function() { return "Apples"; },
Quantity: function() { return 10; },
Price: function() { return 12.50; }
})]})Run Code Online (Sandbox Code Playgroud)
span { padding: 5px; background: pink; }Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
(Click "10" e.g. the Quantity for demo.)
<table>
<tbody data-bind="foreach: OrderedProducts">
<tr>
<td><span data-bind="text:Code"></span></td>
<td><span data-bind="text:Name"></span></td>
<td>
<span data-bind="visible: !IsEditing(), text: Quantity, click: edit"></span>
<input data-bind="value: Quantity, visible: IsEditing, hasfocus: IsEditing" />
</td>
<td><span data-bind="text:Price"></span></td>
</tr>
</tbody>
</table>Run Code Online (Sandbox Code Playgroud)
请记住,同样适用于div元素,在自闭的方式不使用它们或将淘汰赛欺骗你时,你最不希望它.
| 归档时间: |
|
| 查看次数: |
4891 次 |
| 最近记录: |