我有一个保存有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,在添加房间配置文件数据之前将其设置为null。

第二个console.log确认我的ajax方法确实返回了数据,并且格式正确。

第三个console.log显示相同的visitEntryToAdd,并且其上的RoomProfile仍然为null。

我能够通过执行以下操作来使其工作:

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


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

最佳答案

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

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

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


这样,映射将从视图模型的根开始,并且其上的RoomProfile字段是可分配的。如果将字段初始化为{}有意义,则它将起作用,因为不会替换viewmodel上的RoomProfile字段,仅更新其上的字段,因此保留了visitEntryToAdd-> RoomProfile的链接。

关于javascript - 集合中的fromJS fromJSON的 knockout 映射在集合内不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37846575/

10-12 13:42