淘汰所选项目更改

时间:2012-02-28 01:15:31

标签: knockout.js

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

我有一个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?

1 个答案:

答案 0 :(得分:3)

如果没有看到你的整个代码,就很难找出确切的问题,但这里有一个JSFiddle,它以一种稍微不同的方式展示你想要做的事情:

http://jsfiddle.net/jearles/wgZ59/50/

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

-

我猜你的问题在于你如何处理“selectedEntry”。如果底层对象是可观察对象,Knockout将仅更新绑定。看起来你正在使用普通的JS对象。处理完observable后,将绑定更改为'selectedEntry()。expenseDate'形式。注意()... Knockout将observables创建为函数,因此您可以使用observableName()来读取和observableName(value)来编写。在使用JavaScript表达式时,您需要使用“读取”表单。在我的示例中,我使用容器div,以便我可以使用“with”来设置外部上下文,这允许您的内部绑定只是'expenseDate'。