Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js 取消选定项目更改_Knockout.js - Fatal编程技术网

Knockout.js 取消选定项目更改

Knockout.js 取消选定项目更改,knockout.js,Knockout.js,我正在尝试使用与silverlight中的数据表单类似的数据网格创建数据表单功能 我有一个div来显示从网格中选择的项目: $('#readDate').attr('data-bind', 'text : selectedEntry.expenseDate'); $('#readDesc').attr('data-bind', 'text : selectedEntry.expenseDescription'); $('#readAmount').attr('data-bind', 'text

我正在尝试使用与silverlight中的数据表单类似的数据网格创建数据表单功能

我有一个div来显示从网格中选择的项目:

$('#readDate').attr('data-bind', 'text : selectedEntry.expenseDate');
$('#readDesc').attr('data-bind', 'text : selectedEntry.expenseDescription');
$('#readAmount').attr('data-bind', 'text : selectedEntry.expenseAmount');
在我的视图模型中,我有一个设置所选项目的功能:

this.setSelectedEntry = function (id) {
                 vm.selectedEntry = vm.data()[id];
}
所选项目的定义如下:

function ExpenseEntry(Id, expenseDate, expenseDescription, expenseAmount) {
             this.Id = Id;
             this.expenseDate = ko.observable(expenseDate);
             this.expenseDescription = ko.observable(expenseDescription);
             this.expenseAmount = ko.observable(expenseAmount);
         }

但是,每当我更改selectedEntry对象时,UI都不会更新。这是因为UI绑定到对象的成员而不是对象本身吗?如何直接绑定到selectedEntry?

如果看不到您的全部代码,很难找出确切的问题,但下面是一个JSFIDLE,它以稍微不同的方式演示了您正在尝试做的事情:

选择“加载矩阵”加载表格。您可以选择任何项目来填充详细信息

--


我猜您的问题在于如何处理“selectedEntry”。只有当底层对象是可观察对象时,Knockout才会更新绑定。看起来您使用的是一个普通的JS对象。处理可观察对象后,将绑定更改为“selectedEntry().expenseDate”形式。请注意()。。。Knockout将可观察对象创建为函数,因此可以使用observeName()进行读取,使用observeName(value)进行写入。在使用JavaScript表达式时,需要使用“read”表单。在我的示例中,我使用了一个container div,这样我就可以使用“with”来设置外部上下文,它允许您的内部绑定仅为“expenseDate”。

谢谢您的示例。我不明白的一件事是,当您执行此操作时,项是如何传递给select函数的:click:$root.select?我使用的是敲除“click”绑定()。当click事件发生时,Knockout将调用绑定中列出的函数,并将当前数据项作为第一个参数传递。在我的例子中,它调用位于根视图模型中的“select”函数。