2

当下面的对象被映射时,数组中的空""值在 observable 数组中被映射为 false:

var d2 = {
    "values": [{"9", false, "", true, null, "", "", ""]
};

var viewmodel2 = ko.mapping.fromJS(d2);

当使用此映射回 json 时ko.mapping.toJSON(viewmodel2);,结果如下:

{ "values": [
    "9",
    false,
    false,
    true,
    null,
    false,
    false,
    false] }

请注意,数组中的最后 3 个字符串值被转换回 false。

这是一个错误吗?或者是不支持包含布尔值和字符串的数组

这是一个小提琴

4

2 回答 2

2

这确实是一个错误,现在已修复。这是由两件事引起的:

  • 查看数组中包含哪些键的相等比较使用“==”运算符而不是“===”,因此它认为“false”和“”是相同的键。
  • 其次,我对数组中的所有键进行排序,作为重复键处理逻辑的一部分。但是,当您没有明确提供键回调时,这不是应该做的事情,因为在这种情况下您可能关心项目的顺序。

GitHub 上提供了最新版本 1.2.3,并且还创建了一个 NuGet 包。由 Srluisreyes 创建的复制 jsfiddle 现在也可以使用了!

于 2011-08-02T12:22:08.940 回答
1

这似乎绝对是一个错误。

我分叉了你的 jsFiddle 代码,发现问题似乎出在当 toJSON 方法开始解析它采用第一个(“”或 false)并将每个其他(“”或 false)作为找到的初始对象时。

如果这没有多大意义,请尝试在此 jsfiddle 上将对象开头的 false 更改为“”,反之亦然。http://jsfiddle.net/5HhMn/

您可能想在 Steve Sanderson 的 github 页面 https://github.com/SteveSanderson/knockout.mapping上发布有关此问题的信息

于 2011-08-01T02:44:00.180 回答