【问题标题】:knockout.mapping.js, Is it possible to update only a part of mapped variable?knockout.mapping.js,是否可以只更新映射变量的一部分?
【发布时间】:2012-03-16 07:38:15
【问题描述】:

在我的 JS 中,我有以下 ajax 调用,它使用敲除映射插件绑定生成的 json。

$.getJSON("/Game/GetRack", function (data) {
    game.rack = ko.mapping.fromJS(data);
    ko.applyBindings(game.rack, $('.rack')[0]);
});

/Get/GetRack 返回:

[{"Color":3,"Letter":"a","Points":5},null,null]

如您所见,数组中只有一个对象。另外两个是空值。

现在我可以使用剔除映射:

ko.mapping.fromJS([null, { Color: 55, Letter: "b", Points: 88 }, null], game.rack);

这样做会正确更新我的视图,现在我在第二个位置只看到一个字母 B。另外两个是空值。

我的问题是:我可以在不使用 mapping.fromJS 的情况下更新特定位置的值吗?

所以假设我在索引 0 处有一个字母 A,我想将第二个 null 更改为
{ Color: 55, Letter: "b", Points: 88 }
并让我的 UI 自动更新以类似于此更改。如何才能做到这一点?


编辑:

我决定采用 John Earles 给出的示例。不幸的是我还有一个问题,因为我的数组是二维的。

这里有一个示例: http://jsfiddle.net/wgZ59/29/
(它与 John Earles 的示例非常相似,但包含二维数组)。

有人能指出为什么单击更改按钮不会更改元素的值吗?是否也可以在不调用 HasMutated() 的情况下更改它们的值?

还有最后一个(前提是前两个都解决了)。是否可以静态创建 html 表(因为例如我知道它总是 3x3,所以我想要两个 3 行 3 列的打印表,然后将每个单独的单元格绑定到我的矩阵单元格。我已经尝试过了,我有问题,因为敲除没有单元格的值...


编辑2:

我自己回答了上述问题,小提琴示例在这里:

http://jsfiddle.net/wgZ59/44/

所以,当我以这种方式声明数组时,我可以制作一个静态表并绑定单个单元格:

self.matrix = ko.observableArray([[0,0,0],[0,0,0],[0,0,0]]);

self.matrix = ko.observableArray([[,,],[,,],[,,]]);

我可以更新这些值,它适用于静态表,但不适用于动态表(由淘汰赛动态创建)。您可以在小提琴页面上看到行为(此编辑开头的链接)。您知道为什么按“更改”按钮不会更新动态创建的表中的值吗?

【问题讨论】:

    标签: javascript data-binding knockout.js knockout-mapping-plugin


    【解决方案1】:

    我不知道你到底想做什么,但如果 game.rack 是一个 observableArray 那么你可以使用 JavaScript 来操作它。

    这里是 observableArrays 的文档页面:

    http://knockoutjs.com/documentation/observableArrays.html

    该页面显示了 observableArray 本身可用的“帮助”方法。此外,您可以操作底层数组,但您必须在 observableArray 上调用 'valueHasMutated()' 以让任何已注册的侦听器知道更改。

    这是一个简单的 JSFiddle 展示操作:

    http://jsfiddle.net/jearles/wgZ59/8/

    【讨论】:

    • 谢谢约翰。我决定遵循你的设计模式,但我仍然有问题。你能看看我的编辑吗?
    • Knockout 真的只是更喜欢使用对象。依赖跟踪在跟踪 $data 引用时遇到了麻烦。下面的小提琴有效,但它需要您更改为一组简单对象:[{v:1}, {v:2}, {v:3}]。 jsfiddle.net/jearles/wgZ59/46 使用对象的一个​​好处是映射器会将它们转换为可观察对象,并且由于您现在正在更改可观察对象,因此您不再需要“valueHasMutated()”调用。
    • 我确实在我的原始场景中处理对象。我只是不知道这会影响我在 jsfiddle 上发布的案例。我可以从这里开始,再次感谢:)。
    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 2017-01-20
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2015-06-18
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多