【问题标题】:Strange knockout js select option binding issue奇怪的淘汰赛js选择选项绑定问题
【发布时间】:2013-04-24 21:44:41
【问题描述】:

有人可以来看看我在使用 Knockout JS 和绑定选择列表时遇到的一个令人费解的问题吗?

应该通过在选择列表中调用value: favColorId在列表中选择该人最喜欢的颜色,而不是通过value: favColorId()的基于函数的调用,这里发生了很奇怪的事情,我从未使用过( ( /p>

http://jsfiddle.net/goneale/ph8Jw/

【问题讨论】:

  • 嗯...当我测试你的小提琴时,情况正好相反。它适用于favColorId,但不适用于favColorId()
  • favColorId 上的括号是不需要的。 KO 会调用 ko.utils.unwrapObservable()
  • 底部<select/>s 为你选择了吗?他们没有使用括号,也没有为我选择。
  • 将括号从顶部的value: 语句中去掉,所有下拉列表中都没有值被选中。
  • 是的,第二个例子对我有用

标签: javascript knockout.js


【解决方案1】:

我已经包含了我的 mapDictToArray() 函数,但它只是将一个 将 javascript 对象转换为键值 JS 数组。我不认为那是 导致问题。

实际上,这是问题的一部分。该函数返回一个 JavaScript 数组,而不是一个可观察的数组,因此 Knockout 无法正确使用该数组。我对您的代码进行了以下更改:

// The "mapDictToArray" makes a normal JS array, not a ko.observableArray();
// You can't simply "merge" a JS array with an observableArray(); you'll need
// some extra functionality for that: ko.utils.arrayPushAll()
// viewModel.colors(mapDictToArray(dict));
ko.utils.arrayPushAll(viewModel.colors(), mapDictToArray(dict));

// Apply the bindings *after* you've added the contents to the "colors" observable, in order to
// get the correct selected value
ko.applyBindings(viewModel);

这应该可以解决问题(使用正确的 HTML,没有 () )!

JSFiddle.

更新

我想过我的解决方案,但有些地方不正确。唯一正确的是,您需要在添加可观察颜色的内容之后应用绑定This is your fiddle,该部分向下移动。

在你的情况下有效,但是当observableArray 中已经有数据时,你需要使用arrayPushAll 方法。此方法会合并,而您在不使用时将其覆盖 (example with data inside the observable)。

【讨论】:

  • 谢谢 MarcoK,我会好好看看这个示例。我实际上从问题和 jsfiddle 中删除了 mapDictToArray(),因为我认为它没有贡献。我还发现这个没有 mapDictToArray 的(实际上是将数组映射到 dict,我很傻)也不起作用。 jsfiddle.net/goneale/ph8Jw/28 但一切都可能在您的代码中显示出来。再次感谢。
  • 太棒了,再次感谢。不知道ko.utils.arrayPushAll。我将开始将其合并到我的真实项目中,看看现在是否一切正常:)
  • 很高兴为您提供帮助!我确实用更多信息更新了我的答案。希望它在您的实际项目中奏效!
  • 你不会相信我的问题是什么,你让我在考虑顺序和优先级方面走上了正确的轨道。并不是我的映射发生在我的applyBindings 电话之后,但是我有两个任务要执行,1)获取我的页面表单数据 JSON(包括在下拉列表中设置每个人的正确选项)然后 2)检索所有下拉列表选项;我在填充实际的下拉列表选项之前分配了这个人的下拉列表选项!所以它有效地绑定到一个空列表,然后填充列表:\ 感谢您的帮助!
  • 以及重要信息。 arrayPushAll(),在合并作业时会牢记这一点。
猜你喜欢
  • 1970-01-01
  • 2013-05-04
  • 2021-04-28
  • 2019-01-05
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多