敲除加载另一个 AJAX url 以组合模型

Knockout load another AJAX url to combine to model

我有一些复杂的问题。 我的第一个 JSON url 具有此属性、ID、名称和参数。然后在调用JSON的时候,我想去根据ID去取另一个JSONURL得到子ID

然后我想输出为子ID、父名称和父参数。

这是 jsFiddle http://jsfiddle.net/c3L7gr4w/1/

这是模型 url 1

[
{
  "ParemeterValues": "Actual,2011,SYS.LoadCompanies,y,y",
  "ID": "1771cdf7-7a73-49e4-8538-0d0cad965226",     
  "Name": "EXEC.Data.PLandBS.FromFMISMultipleCompanies",   
},
{
  "ParemeterValues": "Actual,2012",
  "ID": "19439ce4-240c-4f2a-98ee-47cb1708b339",
  "Name": "Data.BS.BringForwardOpeningBalances",  
}
 ]

和模型 url2

{
"ID": "1771cdf7-7a73-49e4-8538-0d0cad965226",
"Name": "EXEC.Data.PLandBS.FromFMISMultipleCompanies",
"TM1.ChoreProcessesProcess": 
[
  {
  "Name": "EXEC.Data.PLandBS.FromFMISMultipleCompanies",
  "ID": "dd1acc0b-51ff-4844-b6c4-c67640b326c4",
  }
]
}

我认为您需要调整 dataMappingOptions.key 以便 KO 可以 return 在原始模型之上加载子模型时使用不同的键。

我这里有一个工作 fiddle,我想 - http://jsfiddle.net/sifriday/c3L7gr4w/4/

dataMappingOptions 现在看起来像:

var dataMappingOptions = {
    key: function(data) {
        var ChildID = "";
        if (data["TM1.ChoreProcessesProcess"] != undefined)
            ChildID = data["TM1.ChoreProcessesProcess"][0].ID
        return data.ID + ChildID;       
    },
    create: function(options) {
        return new Person(options.data);
    }        
};

问题在于,当您加载更新的数据时,KO 现在将使用映射来摧毁您原来的人并创建新的人。但是,updatedData 缺少 ParemeterValue,因此您需要将其与原始 JSON 合并。即使您使用 Ajax 也可以,因为您可以将原始 JSON 保存在某处的变量中:

loadUpdatedData: function() {
    // You need to merge in paremeterValues from your orig JSON
    updatedData[0].ParemeterValues = data[0].ParemeterValues;
    // Now good to go...
    ko.mapping.fromJS(updatedData, dataMappingOptions, viewModel.people);  
}

(我也这样做了,所以 ChildID 被附加为额外的 属性,但是你应该能够从这里看到如何让它替换 People 视图模型中的原始 ID在 dataMappingOptions.key)