【问题标题】:Knockoutjs: refresh bindings after populating select listKnockoutjs:填充选择列表后刷新绑定
【发布时间】:2012-04-07 14:27:17
【问题描述】:

我觉得这一定是以前问过的,但我看过

但这些问题并不完全是我面临的问题。

在我看来,我从 ajax 调用中收到了一个视图模型。在该对象中是一个国家 ID。在随后的 ajax 调用中,我检索国家列表(名称和 ID)并从列表中填充一个选择框。

选择框绑定到视图模型的国家 ID 使用

<select data-bind="value: CountryId"/>

但是当我填充下拉列表时,视图模型的国家没有预先选择。我必须手动调用 ko.applyBindings(vm),这是一个问题,因为数据是从处理级联选择框的 jQuery 插件填充的。它没有对视图模型的引用(我也不想提供它)。我可以公开一个回调,但这有点打哈欠。

我创建了a fiddle,更清楚地说明了这个问题。如果你点击 Test Select 按钮,你会注意到下拉菜单被预选为 Item 0。在 js 面板中取消注释该行,Bob 是你的叔叔。

我在这里没有得到什么?这不是基本的淘汰功能吗?

-朱尔斯

【问题讨论】:

  • 我不认为你将能够做你想做的事。值绑定将为选择设置“更改”侦听器,以便在您选择新选项时做出反应。您只是在选择中添加选项,因此 Knockout 无法知道它应该做任何事情。即使它知道,它也会将值重置为 0,因为您的选项没有指定选择哪一行 - 这意味着将选择 0。
  • 我认为你可能是对的。我现在已经使用了回调机制,但是我遇到了一个问题。已使用新信息更新了问题。
  • 从头开始,我已经解决了次要问题。很快就会发布这个问题的答案。
  • 正如您所说,将项目添加到选择列表不会触发“更改”事件。我已经得出结论,这实际上是一件好事。从(非常好的)Knockout tutes 之一:> 绑定捕获 DOM 事件并相应地更新视图模型属性。这是我想要的相反行为!所以我一直坚持回调。目前它只调用applyBindings()。您可以在原始小提琴的this revision 中看到一个示例(为清楚起见,省略了回调等)。

标签: knockout.js


【解决方案1】:

你可以这样做,但你需要访问视图模型:

http://jsfiddle.net/jearles/nw4cH/36/

通过调节 Select 可以防止它在填充 observableArray 之前进行评估(在以后的调用中)。

【讨论】:

  • 嗯,很有趣。不确定我是否喜欢将逻辑放入 cmets 的想法!如果选择列表被填充,然后用一组新值重新填充,这将如何表现?
  • 您不必使用“无容器”语法...您还可以将“if”添加到容器 div。如果选择列表项发生更改,Knockout 将重新评估绑定。我更新了我的示例以显示该语法,并添加了第二个更新和清除按钮。 jsfiddle.net/jearles/nw4cH/77
  • 这是一个很好的例子,谢谢。正如您所看到的,在第二次更新时,绑定从 DOM -> viewmodel 更新(所选项目更改为 5),而不是相反。我现在已经采用手动方法。感谢您帮助我了解发生了什么。我会将您对上述 OP 的评论标记为答案,但 StackOverflow 没有此选项?
【解决方案2】:

正如 John Earles 所说,将项目添加到选择列表不会触发“更改”事件。我已经得出结论,这实际上是一件好事。来自(非常好的)淘汰赛之一:

绑定捕获 DOM 事件并相应地更新视图模型属性。

这与我想要的相反!所以我一直坚持回调。目前它只调用applyBindings()。您可以在原始小提琴的this revision 中看到一个示例(为清楚起见,省略了回调等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    相关资源
    最近更新 更多