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

Javascript knockout.mapping.js,是否可以只更新映射变量的一部分?,javascript,data-binding,knockout.js,knockout-mapping-plugin,Javascript,Data Binding,Knockout.js,Knockout Mapping Plugin,在我的JS中,我有以下ajax调用,它使用knockout映射插件绑定生成的json $.getJSON("/Game/GetRack", function (data) { game.rack = ko.mapping.fromJS(data); ko.applyBindings(game.rack, $('.rack')[0]); }); /Get/GetRack返回: [{“Color”:3,“字母”:“a”,“Points”:5},null,null] 如您所见,数组中

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

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

[{“Color”:3,“字母”:“a”,“Points”:5},null,null]

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

现在,使用敲除映射,我可以做到:

ko.mapping.fromJS([null, { Color: 55, Letter: "b", Points: 88 }, null], game.rack);
这样做可以正确地更新我的视图,现在我在第二个位置上只看到一个字母B。另外两个为空

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

因此,假设索引0处有一个字母a,我想将第二个null更改为
{颜色:55,字母:“b”,点数:88}

并使我的UI自动更新以类似于此更改。如何做到这一点


编辑:

我决定采用约翰·厄尔斯给出的例子。不幸的是,我仍然有一个问题,因为我的数组是二维的

这里有一个示例:
(与John Earles的示例非常相似,但包括二维数组)

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

最后一个(只有在前两个问题都已解决的情况下)。是否可以静态创建html表(例如,我知道它始终是3x3,所以我想要两个打印表,3行3列,然后将每个单元格绑定到我的矩阵单元格。我已经尝试过了,但遇到了问题,因为knockout没有单元格的值


编辑2:

我自己设法回答了上述问题,小提琴示例如下:

因此,当我这样声明数组时,我可以创建一个静态表并绑定单个单元格:

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

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


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

我不知道您到底想做什么,但是如果game.rack是一个可观察的工具,那么您可以使用JavaScript对其进行操作

以下是关于可观察性的文档页面:

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

下面是一个简单的JSFIDLE,显示了操作:


谢谢John。我决定遵循您的设计模式,但我仍然有问题。您能看看我的编辑吗?Knockout确实更喜欢使用对象。依赖项跟踪在跟踪$data引用时遇到问题。下面的小提琴可以工作,但它要求您更改为简单对象数组:[{v:1},{v:2},{v:3}]。使用对象的一个好处是,映射器会将这些对象转换为可观察对象,而且由于您现在正在更改可观察对象,因此不需要“valueHasMutated()'不再调用。我在最初的场景中使用对象。我只是不知道这会影响我在JSFIDLE上发布的案例。我可以从这里开始,再次感谢:)。