【问题标题】:knockout mapping fromJS fromJSON isn't working inside a collection?fromJS fromJSON 的淘汰赛映射在集合中不起作用?
【发布时间】:2016-10-17 05:25:40
【问题描述】:

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

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 具有所有正确的字段,包括在我添加房间配置文件数据之前它设置为 null 的 RoomProfile

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

第三个console.log 显示相同的visitEntryToAdd,而上面的RoomProfile 仍然为空。

我能够通过这样做来完成这项工作:

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

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

【问题讨论】:

  • 这是一个错误吗:您在控制台记录一些未在您的代码示例中定义的labVisitEntryToAdd
  • 复制时出现抽象错误。
  • 如果可能的话,请尝试通过删除 Ajax 代码来创建minimal reproducible example,并包含足够(但尽可能少)的示例数据,以及用于上下文的视图模型代码 / 进行制作可运行。

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


【解决方案1】:

如果visitEntryToAdd.RoomProfile 在映射之前为空,您实际上是在说ko.mapping.fromJS(data, {}, null),并且没有任何东西将新映射的数据与视图模型联系起来。

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

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

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

【讨论】:

  • 那行得通。非常感谢。使用它比我在帖子中发现的方式感觉更好。
猜你喜欢
  • 2012-12-04
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2017-09-09
  • 2012-12-05
相关资源
最近更新 更多