knockout.mapping.js,是否有可能只更新映射变量的一部分?

时间:2012-02-26 16:17:24

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

在我的JS中,我有以下的ajax调用,它使用knockout mapping plugin绑定生成的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,我想将第二个空值更改为
{ Color: 55, Letter: "b", Points: 88 }
并使我的UI自动更新以类似于此更改。如何才能做到这一点?


编辑:

我决定采用John Earles给出的例子。不幸的是我仍然有问题,因为我的数组是两个维度。

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

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

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


EDIT2:

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我不确切知道你要做什么,但如果game.rack是一个observableArray,那么你可以使用JavaScript来操纵它。

以下是observableArrays的文档页面:

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

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

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

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