jS fromJSON的淘汰映射在集合中不起作用?

时间:2016-06-15 22:04:19

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

我的root敲门模型包含一个VisitEntries集合,每个条目都有一个名为RoomProfile的对象。当用户创建访问条目(将空间添加到他们的访问列表)时,应该加载房间的配置文件数据并将其显示给该集合内的用户。但我无法更新相关模型。我之前在其他方面做过这个没问题。我认为存在问题,因为我在我的根VisitEntryToAdd上制作mappedModel的副本,或者因为它在集合中。我不确定,但是当我这样做时,这是与其他时间的唯一区别。

mappedModel.addVisitEntry = function () {

        var visitEntryToAdd = ko.mapping.fromJS(ko.mapping.toJS(mappedModel.VisitEntryToAdd));

        $.ajax({
            url: '/GetRoomProfileForVisit',
            type: 'POST',
            data: ko.mapping.toJSON({ Id: visitEntryToAdd.SelectedRoom.Id() }),
            dataType: "json",
            contentType: 'application/json; charset=utf-8',
            success: function (data) {

                if (data !== null) {
                    console.log("Checking entry before assigning room profile data: \n" + ko.mapping.toJSON(visitEntryToAdd));
                    console.log("Room Profile Data Loaded:\n" + ko.mapping.toJSON(data));
                    ko.mapping.fromJS(data, {}, visitEntryToAdd.RoomProfile);
                    console.log("Checking entry after assigning room profile data: \n" + ko.mapping.toJSON(visitEntryToAdd));
                }

                mappedModel.VisitEntries.push(visitEntryToAdd);

            }
        });
    }

完成上述代码:

首先,console.log显示visitEntryToAdd包含所有正确的字段,包括RoomProfile,在添加房间配置文件数据之前,它设置为空。

第二个console.log确认我的ajax方法确实返回了数据,并且它已经适当地形成了。

第三个console.log显示相同的visitEntryToAddRoomProfile仍为空。

我能够通过以下方式实现这一目标:

visitEntryToAdd.RoomProfile(ko.mapping.fromJS(data));

但我不确定为什么它只能使用fromJS命令,因为它的用法。如果有人可以提供解释,我会将其标记为答案。

1 个答案:

答案 0 :(得分:1)

如果visitEntryToAdd.RoomProfile在映射之前为空,那么您实际上是在说ko.mapping.fromJS(data, {}, null)并且没有任何内容将新映射的数据绑定到视图模型。

您可以通过将访问条目RoomProfile初始化为{}而不是null,或执行映射来解决此问题:

ko.mapping.fromJS({RoomProfile: data}, {}, visitEntryToAdd);

这种方式映射将从viewmodel的根开始,并且其上的RoomProfile字段是可分配的。如果将字段初始化为{}是有意义的,它将起作用,因为视图模型上的RoomProfile字段未被替换,只有其上的字段被更新,因此来自visitEntryToAdd的链接 - > RoomProfile保留。