2012-02-28 65 views
2

我想创建一个使用类似于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不会更新ated。这是因为UI绑定到对象的成员而不是对象本身?我如何直接绑定到selectedEntry?

回答

3

没有看到你的整个代码很难得到精确的问题,但这里是一个的jsfiddle演示你正在尝试在一个稍微不同的方式来做到:

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

选择“加载矩阵”加载一个表格。您可以选择任何项目来填充细节。

-

我猜你的问题是你如何应对“selectedEntry”。如果底层对象是可观察对象,则Knockout只会更新绑定。它看起来像你正在使用一个普通的JS对象。一旦你处理了observable,把你的绑定改为'selectedEntry()。expenseDate'。注意()... Knockout创建observables作为函数,所以你使用observableName()来读取和observableName(值)来写。在使用JavaScript表达式时,您需要使用“读取”表单。在我的例子中,我使用了一个容器div,以便我可以使用“with”来设置外部上下文,它允许你的内部绑定仅仅是'expenseDate'。

+0

感谢您的示例。有一件事我不明白的是,当你这样做时,该项目是如何传递给select函数的:click:$ root.select? – 2012-02-28 17:54:23

+1

我使用Knockout“click”绑定(http://knockoutjs.com/documentation/click-binding.html)。当发生点击事件时,Knockout将调用绑定中列出的函数,并将当前数据项作为第一个参数传递。在我的情况下,它调用位于根视图模型中的“选择”功能。 – 2012-02-28 20:31:12