Knockout.js Knockoutjs:填充选择列表后刷新绑定

Knockout.js Knockoutjs:填充选择列表后刷新绑定,knockout.js,Knockout.js,我觉得这肯定是以前问过的,但我已经看过了 及 但这些问题并不是我所面临的问题 在我看来,我从ajax调用中收到一个viewmodel。在该对象中是一个国家ID。在随后的ajax调用中,我检索一个国家列表(名称和ID),并从列表中填充一个选择框 选择框将使用绑定到viewmodel的国家/地区ID <select data-bind="value: CountryId"/> 但是当我填充下拉列表时,viewmodel的国家/地区不是预先选择的。我必须手动调用ko.

我觉得这肯定是以前问过的,但我已经看过了

但这些问题并不是我所面临的问题

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

选择框将使用绑定到viewmodel的国家/地区ID

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

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

我创建了一个更清晰地说明这个问题的模型。如果单击测试选择按钮,您将注意到下拉列表已预选为项目0。取消对js面板中的行的注释,Bob是您的叔叔

我在这里没有得到什么?这不是一个基本的击倒功能吗


-Jules

您可以执行类似操作,但需要访问视图模型:


通过关闭Select,您可以阻止它进行计算,直到您填充了observableArray(在稍后的调用中)。

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

绑定捕获DOM事件并相应地更新viewmodel属性


这与我想要的正好相反!所以我坚持回电话。目前它只调用applyBindings()。您可以在fiddle的原始版本中看到一个示例(为了清晰起见,省略了回调等)。

我认为您无法完成您想要做的事情。值绑定将为select设置“更改”侦听器,以便在您选择新选项时作出反应。您只是向select添加选项,因此Knockout无法知道它应该做什么。即使它确实知道,它也会将值重置为0,因为您的选项没有指定选择哪一行-这意味着将选择0。我认为您可能是对的。我现在已经使用了回调机制,但是我遇到了一个问题。我已经用新信息更新了问题。我已经解决了第二个问题。稍后将发布此问题的答案。因此,正如您所说,将项目添加到选择列表不会触发“更改”事件。我得出结论,这实际上是件好事。从其中一个(非常好):>绑定捕获DOM事件并相应地更新viewmodel属性。这与我想要的正好相反!所以我坚持回电话。目前它只调用
applyBindings()
。你可以看到一个原始小提琴的例子(为了清晰起见省略了回调等)。嗯,很有趣。我不确定我是否喜欢在评论中加入逻辑!如果填充了选择列表,然后用一组新的值重新填充,这会是怎样的行为?您不必使用“无容器”语法。。。您还可以将“if”添加到容器div中。如果选择列表项发生更改,则Knockout将重新评估绑定。我已经更新了我的示例以显示该语法,并添加了第二个更新和清除按钮。这是一个很好的例子,谢谢。正如您所看到的,在第二次更新时,绑定从DOM->viewmodel(选定项更改为5)更新,而不是相反。我现在采用的是手动方法。谢谢你帮我看看发生了什么事。我会把你的评论标记在上面的OP上作为答案,但是StackOverflow没有这个选项?