敲除加载另一个 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)
我有一些复杂的问题。 我的第一个 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)