2

这是设置:

用户在页面“A”上。有一个用于导航的下拉菜单 (DROPDOWN)。用户可以选择 2 个选项:A、B。其中 A 代表当前页面,B 是用户想要访问的内容。

此下拉列表绑定到一个依赖的可观察对象(GUARD),该可观察对象(GUARD)可以读取并且可能会或可能不会写入另一个保存该下拉列表状态的常规可观察对象(TARGET)。

下拉 <-- --> 守卫 <-- ?--> 目标

这个想法是,如果用户在下拉菜单中选择了一些内容以离开页面,我们首先检查是否有任何未保存的更改,如果有,我们会询问用户是要丢弃它们还是留在页面上并继续编辑.

所以情况:有未保存的更改。用户从下拉列表中选择一些东西。GUARD 通过调用它的“write”方法来启动。我们会提示用户是否要放弃更改并离开页面或留下。用户选择留下。我们说 'fine' 并且 write 方法不做任何事情,所以目标 observable 保持不变。故事结局!但..

当用户触摸下拉菜单并且“更改”甚至没有被取消(没有办法在绑定的 observable 内进行)时,下拉菜单进入状态“B”,就好像用户选择离开页面一样。

所以我的问题很简单:

  • 有没有办法从下拉绑定的依赖可观察对象的“写入”方法中取消“更改”事件?

  • 如果不是,我该如何摆脱这种情况,使下拉列表的选择与 TARGET observable 保持同步?

4

1 回答 1

2

'change' 事件发生下拉列表已经更改之后,因此一个简单的解决方案是使用旧值使下拉列表“刷新”,只需调用target.valueHasMutated(). 小提琴示例:http: //jsfiddle.net/KXhem/77/

编辑:自淘汰赛 3 以来,计算的仅在其值确实发生变化时才通知。要获得相同的行为,您可以添加.extend({ notify: 'always' })到计算中。在此处查看完整的详细信息:http: //knockoutjs.com/upgrade-notes/v3.0.0.html

于 2012-10-24T23:14:10.047 回答