extjs深入搜索存储数据?
在Flex应用程序中,元数据作为xml加载,这对于深入搜索xml节点具有非常好的功能。在extjs版本中,我将xml数据转换为json,保留深层层次内容,并使用json读取器加载到extjs存储。我还没有创建一个模型,认为这是没有必要的,因为该模型没有添加任何搜索功能(?)。我正在看store.find,store.findBy,它可以使用函数store.findRecord等,但这些函数看起来非常“一级”。我需要转到“Tabs”节点,找到它的子“Tab”,其“Name”为“Tab1”,并找到其属性“Title”的值。。。我使用的描述是“节点”,但它是层次化的json数据。我是否缺少可以做到这一点的存储功能,我是否应该使用存储的原始json数据——json是否具有更好的搜索功能,还是应该通过循环所有“节点”恢复到暴力javascript?我希望避免循环并找到某种函数。与往常一样,tia从我们的评论中我了解到,您需要一种存储,以便尽可能快速、轻松地访问您的JSON数据。 JSON意味着JavaScript对象符号,所以它是一个对象 好,我举两个例子。 首先,设置JSON数据:extjs深入搜索存储数据?,extjs,Extjs,在Flex应用程序中,元数据作为xml加载,这对于深入搜索xml节点具有非常好的功能。在extjs版本中,我将xml数据转换为json,保留深层层次内容,并使用json读取器加载到extjs存储。我还没有创建一个模型,认为这是没有必要的,因为该模型没有添加任何搜索功能(?)。我正在看store.find,store.findBy,它可以使用函数store.findRecord等,但这些函数看起来非常“一级”。我需要转到“Tabs”节点,找到它的子“Tab”,其“Name”为“Tab1”,并找到其
{
"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 search查找我们需要的内容:
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来测试最后一个:
我希望能理解你的要求。如果我没有,请用你自己的例子告诉我;) 好吧,我从我们的评论中了解到,您需要一种存储来尽可能快速、轻松地访问您的JSON数据。 JSON意味着JavaScript对象符号,所以它是一个对象 好,我举两个例子。 首先,设置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 search查找我们需要的内容:
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来测试最后一个:
我希望能理解你的要求。如果我没有,请用你自己的例子告诉我;) 你可以发布一个json的例子吗?json可以是任何格式,因为我创建它作为元数据来定义应用程序本身。它具有很高的层次性,例如,如上所述,一个选项卡栏有多个带属性的选项卡,每个选项卡都有带属性的网格等。我想知道我是否应该将其格式化以加载到树存储中,树存储似乎有更多的“深入”功能?我认为问题不在于存储的类型:可能,你需要模型关联来管理嵌套的json数据。我想知道这一点,但模型似乎更像是传统“从后端加载业务数据,允许用户修改,保存到后端”的一部分,等等?由于这是应用程序功能内部的元数据,因此我需要一种有效的方法,在需要时获取正确的“节点”。您可以发布一个json示例吗?json可以是任何格式,因为我将其创建为元数据来定义应用程序本身。它具有很高的层次性,例如,如上所述,一个选项卡栏有多个带属性的选项卡,每个选项卡都有带属性的网格等。我想知道我是否应该将其格式化以加载到树存储中,树存储似乎有更多的“深入”功能?我认为问题不在于存储的类型:可能,你需要模型关联来管理嵌套的json数据。我想知道这一点,但模型似乎更像是传统“从后端加载业务数据,允许用户修改,保存到后端”的一部分,等等?因为这是应用程序功能内部的元数据,所以我需要一种在需要时获取正确节点的有效方法。非常好的示例并解释了所有内容-非常感谢!好的:-)如何将我的问题标记为answered@MicC在“1答案”下面有两个箭头和一个数字。如果您感谢我的回答,您可以单击向上箭头给我奖金,否则如果您不喜欢,只需单击向下箭头即可。最后,单击向下箭头下方的“V”按钮,将问题标记为已回答,并将其从灰色切换为绿色;)我们两个都将获得一些积分;)显然,我需要“15声望”来点击向上箭头-我必须去杀死一条龙并营救一位公主,对吗?:-)15个或更多?”因为你得到了15分,但是,杀死一条龙和拯救一位公主可以帮助你!非常好的例子和解释一切-非常感谢!好的:-)如何将我的问题标记为answered@MicC在“1答案”下面有两个箭头和一个数字。如果您感谢我的回答,您可以单击向上箭头给我奖金,否则如果您不喜欢,只需单击向下箭头即可。最后,单击向下箭头下方的“V”按钮,将问题标记为已回答,并将其从灰色切换为绿色;)我们两个都将获得一些积分;)显然,我需要“15声望”来点击向上箭头-我必须去杀死一条龙并营救一位公主,对吗?:-)15个或更多?”因为你得到了15分,但是,杀死一条龙和拯救一位公主可以帮助你!