1

我有一个大型 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>
4

1 回答 1

1

对于初学者,您引用 observableArrays 就好像它们是我们可观察的一样。你需要一个 data-bind=foreach: Alarms() 在某个地方。

好的:看看这个 jsFiddle 是否对你有帮助:http: //jsfiddle.net/8QVe6/

请注意,我制作了属性 camelCased(即 managementModule)。

于 2012-10-12T00:49:25.010 回答