Sencha Touch 2从嵌套JSON中的键AND值读取值

时间:2012-05-07 09:42:28

标签: json sencha-touch sencha-touch-2

我正在尝试加载一些JSON,其中我为儿科患者存储了大约100种麻醉药物的变量。

在患者体重,年龄等之前计算实际值:

示例:

var propofolInductionTitle = propofolName + ' ' + propofol0PercentConcentration + '- Induktion';
var propofol0InductionDosageMG = (Math.round(kg * 2 * 10) / 10) + ' - ' + (Math.round(kg * 5 * 10) / 10);

然后我创建我的药物作为json块,由我需要的变量组成,稍后将被计算值替换。我特意尝试避免使用JSON中的字符串,以便在数学块中定义所有变量时更容易本地化为英语和法语。

var hypnotikaJSON = {
            "thiopentalTitle": [
                {"thiopentalBrandName": ""},
                {"vialContentTitle": "thiopentalVialContent"},
                {"solutionTitle": "thiopentalSolution"},
                {"concentrationTitle": "thiopentalConcentration"},
                {"dosageString": "thiopentalDosageString"},
                {"atWeight": "thiopentalDosageMG"},
                {"thiopentalAtConcentration": "thiopentalDosageML"}
            ],
            "propofolInductionTitle": [
                {"propofolInductionBrandName": ""},
                {"propofolVialContentTitle": "propofolInductionVialContent"},
                {"propofolSolutionTitle": "propofolSolution"},
                {"propofolConcentrationTitle": "propofolInductionConcentration"},
                {"propofolInductionDosageStringTitle": "propofolInductionDosageString"},
                {"atWeight": "propofolInductionDosageMG"},
                {"propofolAtInductionConcentration": "propofolInductionDosageML"}
            ],
            "propofolSedationTitle": [
                {"propofolSedationBrandName":""},
                {"propofolVialContentTitle":"propofolSedationVialContent"},
                {"propofolSolutionTitle":"propofolSolution"},
                {"propofolConcentrationTitle":"propofolSedationConcentration"},
                {"propofolSedationDosageStringTitle":"propofolSedationDosageString"},
                {"atWeight":"propofolSedationDosageMG"},
                {"propofolAtSedationConcentration":"propofolSedationDosageML"}
            ],
            "laryngealMaskTitle": [
                {"laryngealMaskSizeTitle":"laryngealMaskSize"},
                {"laryngealMaskCuffSizeTitle":"laryngealMaskCuffSize"},
                {"laryngealMaskBiggestETTTitle":"laryngealMaskBiggestETT"},
                {"laryngealMaskBronchoscopeSizeTitle":"laryngealMaskBronchoscopeSize"}
            ]
    };

我特别需要JSON阅读器必须给我每个对象的关键AND值,因为我需要填充模板。原因是药物的区域部分不同。有些人有额外的给药途径,所以我有另一个关键:价值对不同的药物没有。有些是按推注和每次滴注,有些不是。所以没有方便的json结构。 我找到了rdougan here的答案,部分允许我这样做:

型号:

Ext.define('my.model.Drug', {
        extend: 'Ext.data.Model',
        config: {
            fields: ['name', 'value']
        }
    });

自定义Json Reader:

Ext.define('Ext.data.reader.Custom', {
        extend: 'Ext.data.reader.Json',
        alias: 'reader.custom',
        getRoot: function (data) {
            if (this.rootAccessor) {
                data = this.rootAccessor.call(this, data);
            }

            var values = [],
                name;

            for (name in data) {
                values.push({
                    name: name,
                    value: data[name]
                });
            }

            return values;
        }
    });

商店:

var store = Ext.create('Ext.data.Store', {
        fields: ['name', 'value'],
        data: hypnotikaJSON,
        autoLoad: true,
        proxy: {
            type: 'memory',
            reader: {
                type: 'custom'
            }
        }
    });

面板:

this.viewport = new Ext.Panel({
        fullscreen: true,
        layout: 'fit',
        items: [{
            xtype: 'list',
            itemTpl: '<p class="description">{name}</p><p class ="values">{value}</p>',
            store: store
        }]
    });

不幸的是,我是一名医生而且没有程序员,经过大量阅读后,我无法将其应用于嵌套的JSON。自定义阅读器似乎只适用于第一级。 我可以在没有阅读器的情况下做到这一点,没有一个商店,每个条目周围只有很多计划html,但事实证明它非常慢,所以我想在从Sencha Touch 1.1更新时避免使用它。并且这次做得更好。

请您指点一种解析这个丑陋数据结构的方法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我对扩展JSON读者不太了解,所以只是猜测,但也许你应该覆盖'read'方法?然后你可以按照自己的意愿浏览JSON
此外,如果您可以控制JSON,则应考虑更改它 通常,JSON中的键在数组中的所有项目中都应该相同 密钥不是数据,它们是元数据 所以,如果你在不同的药物之间确实有不同的属性,那么这样的事情可能是一个解决方案:

  

[{

     
    

名称:'丙泊酚1%',
    属性:[

         
      

{title:'induction',value:'22 -56g'},
      {标题:'镇静',价值:'22'},
      等
      ]},
      {name:'nextDrug'}
      等。