【发布时间】: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