2012-02-09 43 views
3

我需要将ViewModel中的主源代码中的一些数据克隆到对话框中。原因是用户可以取消对话框,我不希望主人反映这些取消的更改。如何使用敲除映射克隆和重新绑定我的数据?

我在对话框中创建主数据的复制副本,并将数据绑定设置为拾取“本地编辑的*”特性。如果用户点击确定,那么我会尝试将数据保存到主数据库中(如果它已编辑),否则请将数据按其新数据进行推送。

editItem: function(data) { 
      // clone a temporary copy for the dialog      
      this.localEdited = ko.mapping.fromJS(ko.toJS(data));    
      $("#dlgAdd").dialog("open"); 
     }, 

以上目前的工作,但是,如果我点击主人的另一个项目,该对话框不显示更新的值。它好像ko.mapping.fromJS只能工作一次,然后再也不会。它总是拿起第一个值。我如何解决这个问题?我觉得我需要重新绑定价值观,但是KO的全部意义在于不必这样做。

我该如何将数据持久化回父项。我想我可能会遇到与上面相同的问题。

顺便说一句,我正在使用KnockoutJS 1.2.1。

回答

4

localEdited需要是可观察的,你应该在editItem函数中做this.localEdited(ko.mapping.fromJS(ko.toJS(data)))函数,以在每次调用editItem的时候使knockout重新绑定对话框。在该对话框中的数据绑定将需要改变以localEdited()。*

你可以逃脱不localEdited是可观的,但在这种情况下,你将需要editItem功能手动更新的localEdited每个观察特性。所以你必须有类似的东西

this.localEdited.property1(data.property1()); 
this.localEdited.property2(data.property2()); 

关键是你需要使用函数调用语法来更新observables。这样淘汰赛将捕获更新并通过绑定传播它。在你的初始代码中,你只需要简单地分配到localEdited,所以淘汰赛不会有拦截并发挥其魔力的钩子。

UPDATE: 原来ko.mapping插件可以在模型中自动更新个别观测,所以你不必做手工:

ko.mapping.fromJS(ko.toJS(data), this.localEdited); 
+0

这个好,谢谢。为什么当所有的单个属性都是包装的'localEdited'本身必须是可观察的? – jaffa 2012-02-09 17:34:29

+0

你可以不用localEdited就可以观察到,但在这种情况下,你需要手动更新editItem函数中localEdited的每个observable属性。所以你将不得不有这样的this.localEdited.property1(data.property1()); this.localEdited.property2(data.property2());等等 – 2012-02-09 17:38:45

+0

好吧我现在明白了,当每个任务需要更新UI时,淘汰赛需要一些知道的方法。在这种情况下,可观察的分配是钩子。如果我明白,我知道它是一个很好的解释! – jaffa 2012-02-09 23:23:17