【问题标题】:Mapping plugin taking too long to update model映射插件更新模型的时间太长
【发布时间】:2016-03-13 18:06:18
【问题描述】:

我正在使用 KO 3.2,但在使用映射器插件时遇到了一个奇怪的问题。

我使用以下代码获取一些 json 数据并更新我的模型。

self.load = function (item, event) {    

        var d = { expedienteId: self.Id(), id: item.Id() };

        $.ajax({
            type: "POST",
            url: "/Expediente/Evolucion/",
            data: JSON.stringify(d),
            contentType: "application/json; charset=utf-8",
            cache: false,
            dataType: "json"
        })            
        .success(function (data) {
            ko.mapping.fromJS(data.Data, {}, self.Evolucion);                
        })            
    };

返回的数据是:

{"Success":true,"Message":null,"Data":{"Id":1,"ExpedienteId":0,"Fecha":"\/Date(1443304800000)\/","Medico"
:"Gabriel R Lopez Gutierrez","ImagenDescriptiva":null,"Sintoma":"Sintomas","Objetivo":"Objetivo","Diagnostico"
:"Diagnostico 1","Analisis":"Analisis","Observaciones":"Oservaciones","CieCode":"Y55.5","CieDescription"
:"Efectos adversos de drogas contra el resfriado común","Tratamiento":"Tratamiento","Pronostico":"Pronostico"
,"Anotaciones":"Anotaciones","RequiereCirugia":true,"Descripcion":null,"TensionArterial":0.00000,"FrecuenciaCardiaca"
:0.00000,"FrecuenciaRespiratoria":0.00000,"Temperatura":0.00000,"HabitusExterior":"habitus exterior"
,"Peso":65.00000,"Talla":2.39000,"IndiceMasaCorporal":0.00000,"PerimetroCefalico":69.90000,"SuperficieCorporal"
:1.99000,"SegmentoSuperior":2.39000,"SegmentoInferior":2.39000,"ExtremidadInferior":1.49000,"PerimetroAbdominal"
:1.99000,"PerimetroBraquial":0.89000,"PerimetroAnterobraquial":0.89000,"PerimetroToracico":5.99000,"PerimetroSural"
:1.79000,"PerimetroCrural":0.00000,"Braza":0.00000,"Brazada":2.39000},"Errors":null}

这段代码有 2 个问题。 1)第一个是我需要使用ko.mapping.fromJS - ko.mapping.fromJS(data.Data, {}, self.Evolucion)。出于某种原因,每当我使用 ko.mapping.fromJSON 时,我的模型都不会被填充。值得一提的是,我确实在应用程序的其他部分使用了 fromJSON,它运行良好。

2) 第二个问题是:由于 fromJSON 不起作用,我使用 fromJS 出于某种原因,即使我将 json 字符串传递给它,它仍然有效。无论如何,虽然 fromJS 确实有效,但将数据映射到我的模型大约需要 25 秒。处理此行时,我的浏览器冻结,我收到 Firefox 没有响应消息,25 秒后它又回来了,我的模型被正确填充。

有什么想法可以解决这个问题吗?要么修复它以便我可以使用 fromJSON,要么修复它以便 fromJS 不会挂起并花费很长时间来进行映射?

非常感谢任何帮助。

谢谢!

更新 这是 Evolucion (C#) 的模型:

public class Evolucion
    {
        public int Id { get; set; }
        public int ExpedienteId { get; set; }
        public DateTime Fecha { get; set; }

        public string Medico { get; set; }

        public string ImagenDescriptiva { get; set; }
        public string Sintoma { get; set; }
        public string Objetivo { get; set; }
        public string Diagnostico { get; set; }
        public string Analisis { get; set; }
        public string Observaciones { get; set; }
        public string CieCode { get; set; }
        public string CieDescription { get; set; }
        public string Tratamiento { get; set; }
        public string Pronostico { get; set; }
        public string Anotaciones { get; set; }
        public bool RequiereCirugia { get; set; }

        public string Descripcion { get; set; }
        public decimal TensionArterial { get; set; }
        public decimal FrecuenciaCardiaca { get; set; }
        public decimal FrecuenciaRespiratoria { get; set; }
        public decimal Temperatura { get; set; }
        public string HabitusExterior { get; set; }

        public decimal Peso { get; set; }
        public decimal Talla { get; set; }
        public decimal IndiceMasaCorporal { get; set; }
        public decimal PerimetroCefalico { get; set; }
        public decimal SuperficieCorporal { get; set; }
        public decimal SegmentoSuperior { get; set; }
        public decimal SegmentoInferior { get; set; }
        public decimal ExtremidadInferior { get; set; }
        public decimal PerimetroAbdominal { get; set; }
        public decimal PerimetroBraquial { get; set; }
        public decimal PerimetroAnterobraquial { get; set; }
        public decimal PerimetroToracico { get; set; }
        public decimal PerimetroSural { get; set; }
        public decimal PerimetroCrural { get; set; }
        public decimal Braza { get; set; }
        public decimal Brazada { get; set; }
    }

【问题讨论】:

  • 请添加您的型号代码
  • @Everv0id - 我添加了模型。这就是在 ko.mapping.fromJS(data.Data, {}, self.Evolucion); 中作为 data.Data 的一部分返回的内容;
  • 您返回的数据是 JS,而不是 JSON 字符串。当你告诉 jQuery 你正在获取 json 时,它会为你解包。
  • 其他浏览器有同样的问题?您是否也在 Chrome 中对其进行了调试?我想说问题不在于映射,而在于其他地方。您是否尝试过在不绑定模型的情况下映射它,我没有调用applyBindings 并进行映射以检查它是否运行缓慢。
  • @RoyJ - 你完全正确。我以为我正在返回一个 json 字符串,但它确实是一个对象。进行建议的更改后, .fromJSON 起作用了,但我遇到了同样的问题。根据我的回复,问题在于映射一个不应该从一开始就被映射的属性。谢谢!

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


【解决方案1】:

感谢您的帮助。事实证明,一个非常大的数组属性被映射(并且不应该有),当使用.fromJS.fromJSON 刷新模型时,它会导致 UI 阻塞。

在映射('ignore': [Properties])期间忽略属性后,离开时出现问题。

再次感谢您的帮助!

【讨论】:

    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 2012-07-31
    • 2010-12-10
    • 2013-05-20
    • 2015-06-18
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    相关资源
    最近更新 更多