我有一个大型 XML 文件(转换为 JSON),其中包含多个具有相同结构的重复部分。myAttributes
除了特定于部分的属性外,每个部分都有一组结构相同的属性(XML 到 JSON 的转换将所有属性移动到一个名为 的对象中)。我的目标是能够读取现有的 XML 并生成新的 XML。
我尝试使用映射插件,把它只允许我读取 XML,而不是生成它,加上对象元素之间存在多个相互依赖关系。
我认为解决此问题的最佳方法是预先定义一组与 XML 的小部分匹配的对象。当组装在一起时,这些对象将能够生成我需要的 XML 结构。这样,我可以循环通过我从 XML 生成的 JSON 数组,使用适当的数据填充我预定义的对象并将它们附加到我的 viewModel(比如说 10 个警报、3 个操作、6 个指标分组等)。从预定义的对象生成 XML 也应该很容易。
但是,由于我对 JavaScrip 和 KnockoutJS 普遍缺乏经验,我很难弄清楚这一点。
// Main Top Level Management Module Object
function ManagementModule(data) {
this.myAttributes = new Object();
this.myAttributes.Name = ko.observable(data.Name);
this.myAttributes.IsActive = ko.observable(data.IsActive);
this.myAttributes.DescriptionContentType = ko.observable(data.DescriptionContentType);
this.myAttributes.Description = ko.observable(data.Description);
// There are other object specific properties, but I omitted them for now
}
// New Alert Object. It will be deep in the hierarchy of the main top level object
// but for now i will make it top level for test purposes.
function Alert(data) {
this.myAttributes = new Object();
this.myAttributes.Name = ko.observable(data.Name);
this.myAttributes.IsActive = ko.observable(data.IsActive);
this.myAttributes.DescriptionContentType = ko.observable(data.DescriptionContentType);
this.myAttributes.Description = ko.observable(data.Description);
// There are other object specific properties, but I omitted them for now
}
// View Model
function myModel() {
var self = this;
self.ManagementModule = ko.observableArray();
self.Alerts = ko.observableArray();
};
var myViewModel = new myModel();
然后我遍历我的 JSON 并尝试将内容附加到视图模型......这就是事情无法正常工作的地方。也许是因为我误解了这些对象......
$.getJSON("/getXML", function (data) {
for (var key in data) {
// Do something here
}
// This seems to work OK. There is only 1 so, I just
// set it.
myViewModel.ManagementModule(data['myAttributes']);
for (var i = 0; i < data['DataGroups']['DataGroup'].length; i++) {
var current = data['DataGroups']['DataGroup'][i];
if(current['AlertBase']) {
var AlertBase = current['AlertBase'];
// There are multiple Alarts
for (var i = 0; i < AlertBase.length; i++) {
myViewModel.Alerts.push(Alert(AlertBase[i].myAttributes));
}
}
};
ko.applyBindings(myViewModel);
});
这有点有效....当我尝试绑定它时
<div data-bind="text: Alerts.myAttributes.Name"></div>
<div data-bind="text: ManagementModule.myAttributes.Name"></div>
它不工作。如果我这样绑定:
<div data-bind="text: myAttributes.Name"></div>
它输出两者,myViewModel.ManagementModuleName.myAttributes.Name
最后一个myViewModel.Alert.myAttributes.Name
连接在一起。
我究竟做错了什么?如何从多个嵌套对象中组装一个 viewModel?
更新:刚刚意识到我绑定不正确,但这仍然会产生一堆
myViewModel.ManagementModuleName.myAttributes.Name
和最后一个myViewModel.Alert.myAttributes.Name
连接在一起
<div data-bind="foreach: Alerts()">
<div data-bind="text: myAttributes.Name"></div>
</div>
我想我解决了它......
myViewModel = new ManagementModule(data['myAttributes']);
myViewModel.Alerts = ko.observableArray();
myViewModel.Alerts.push(new Alert(AlertBase[i].myAttributes));
<div data-bind="text: myAttributes.Name"></div><br />
<div data-bind="foreach: Alerts()">
<div data-bind="text: myAttributes.Name"></div>
</div>