extjs深入搜索商店数据?

时间:2012-09-16 05:23:27

标签: extjs

在Flex应用程序中,元数据作为xml加载,具有非常好的功能,可以深入搜索xml节点。在extjs版本中,我将xml数据转换为json,保留了深层次内容,并使用json reader加载到extjs Store。我没有创建模型,认为这不是必需的,因为模型没有添加添加任何搜索功能(?)。我正在查看store.find,store.findBy,它可以使用函数,store.findRecord等,但这些函数看起来非常“一层”。我需要转到'Tabs'“节点”,找到其子项'Tab','Name'为'Tab1',并找到其属性'Title'的值......我正在使用描述“node”但是它是分层的json数据。我是否缺少可以执行此操作的商店功能,如果我使用商店的原始json数据 - json是否具有更好的搜索功能,还是应该通过循环遍历所有“节点”来恢复暴力javascript?我希望避免循环并找到某种功能。一如既往,tia

1 个答案:

答案 0 :(得分:3)

嗯,我从评论中了解到,您需要一种存储来尽可能快速,轻松地访问 JSON 数据。 JSON表示 JavaScript Object Notation ,因此它是一个对象!

好的,我举两个例子。 首先,设置JSON数据:

{
    "users": [{
        "user": {
            "id": 0 ,
            "name": "foo" ,
            "age": 22 ,
            "skills": [{
                "type": "bowcrafting" ,
                "skillLevel": 50 ,
                "levels": [10, 25, 50, 75, 90, 95, 99, 100]
            }]
        }} , { 
        "user": {
            "id": 1 ,
            "name": "bar" ,
            "age": 71 ,
            "skills": [{
                "type": "fencing" ,
                "skillLevel": 32 ,
                "levels": [10, 25, 50, 90, 95, 99, 100]
            } , {
                "type": "swordsmanship" ,
                "skillLevel": 73 ,
                "levels": [10, 25, 50, 75, 80, 85, 90, 95, 99, 100]
            }]
        }} , {
        "user": {
            "id": 2 ,
            "name": "foobar" ,
            "age": 132 ,
            "skills": [{
                "type": "tactics" ,
                "skillLevel": 90 ,
                "levels": [10, 25, 50, 90, 95, 99, 100]
            } , {
                "type": "carpentery" ,
                "skillLevel": 86 ,
                "levels": [10, 25, 50, 75, 90, 95, 99, 100]
            } , {
                "type": "hiding" ,
                "skillLevel": 100 ,
                "levels": [10, 25, 50, 65, 75, 80, 85, 90, 95, 99, 100]
            }]
        }
    }]
}

现在我们有两种方法可以遵循:

第一种方式:我们可以想象上面的JSON保存到一个名为 nested-json.json 的文件中,我们用一个简单的商店读取它。然后,我们可以使用 findBy 搜索找到我们需要的东西:

var jstore = Ext.create ('Ext.data.Store', {
    fields: ['id', 'name', 'age', 'skills'] ,

    proxy: {
        type: 'ajax' ,
        url: 'nested-json.json' ,
        reader: {
            type: 'json' ,
            root: 'users' ,
            record: 'user' ,
            idProperty: 'id'
        }
    } ,

    autoLoad: true
});

Ext.create ('Ext.button.Button', {
    text: 'Push me' ,
    renderTo: Ext.getBody () ,
    handler: function (btn) {
        var index = jstore.findBy (function (user, id) {
            // Here's the hint
            if (user.data.skills.skillLevel === 50) return id;
            else return -1;
        });

        if (index != -1) {
            // It will print 'foo' because it's the user
            // that has the skillLevel equal to 50
            console.log (jstore.getAt(index).get ('name'));
        }
    }
});

另一种方法是将上述JSON 想象成一个对象,直接从原始JSON数据中读取。此时,只需将其用作javascript对象:

// Users model: required by JSON reader
Ext.define ('Users', {
    extend: 'Ext.data.Model' ,
    fields: ['id', 'name', 'age', 'skills']
});

// JSON reader
var jreader = Ext.create ('Ext.data.reader.Json', {
    model: 'Users' ,
    root: 'users' ,
    record: 'user' ,
    idProperty: 'id'
});

// Reads records directly from raw JSON
var users = jreader.readRecords ({
    "users": [{
        "user": {
            "id": 0 ,
            "name": "foo" ,
            "age": 22 ,
            "skills": [{
                "type": "bowcrafting" ,
                "skillLevel": 50 ,
                "levels": [10, 25, 50, 75, 90, 95, 99, 100]
            }]
        }} , { 
        "user": {
            "id": 1 ,
            "name": "bar" ,
            "age": 71 ,
            "skills": [{
                "type": "fencing" ,
                "skillLevel": 32 ,
                "levels": [10, 25, 50, 90, 95, 99, 100]
            } , {
                "type": "swordsmanship" ,
                "skillLevel": 73 ,
                "levels": [10, 25, 50, 75, 80, 85, 90, 95, 99, 100]
            }]
        }} , {
        "user": {
            "id": 2 ,
            "name": "foobar" ,
            "age": 132 ,
            "skills": [{
                "type": "tactics" ,
                "skillLevel": 90 ,
                "levels": [10, 25, 50, 90, 95, 99, 100]
            } , {
                "type": "carpentery" ,
                "skillLevel": 86 ,
                "levels": [10, 25, 50, 75, 90, 95, 99, 100]
            } , {
                "type": "hiding" ,
                "skillLevel": 100 ,
                "levels": [10, 25, 50, 65, 75, 80, 85, 90, 95, 99, 100]
            }]
        }
    }]
});

// Here's the magic
Ext.each (users.records, function (user) {
    console.log ('*** USER ***');
    console.log (user);

    console.log ('id: ' + user.get ('id'));
    console.log ('name: ' + user.get ('name'));
    console.log ('age: ' + user.get ('age'));

    Ext.each (user.get ('skills'), function (skill) {
        console.log ('*** SKILL ***');
        console.log (skill);

        console.log ('type: ' + skill.type);
        console.log ('level: ' + skill.skillLevel);

        console.log ('*** LEVELS ***');
        Ext.each (skill.levels, function (level) {
            console.log (level);
        });
    });
});

这是一个 jsfiddle 来测试最后一个:jsfiddle

我希望能理解你的要求。如果我没有,请通过自己的例子让我知道;)