extJS4.2.0 Json数据解析,嵌套及非嵌套(二)

Ext.data.reader.Reader

Readers通常用于翻译数据,使其被加载为 Model 实例或Store, 该数据一般是一个AJAX请求的响应数据. 一般情况下不需要直接创建一个Reader实例, 因为Reader总是和Proxy一起使用, 且其将使用Proxy的reader 配置属性配置

1
2
3
4
5
6
7
8
9
10
11
Ext.create( 'Ext.data.Store' , {
     model: 'User' ,
     proxy: {
         type: 'ajax' ,
         url : 'users.json' ,
         reader: {
             type: 'json' ,
             root: 'users'
         }
     },
});

以上的reader是配置来消耗一个JSON字符串,使其开起来如下:

1
2
3
4
5
6
7
{
     "success" : true ,
     "users" : [
         { "name" : "User 1" },
         { "name" : "User 2" }
     ]
}

加载嵌套数据

根据每个模型上的associations配置,Readers拥有自动加载多级嵌套的数据对象的能力. 以下是一个例子,用于验证一个虚构的CRM系统(管理了User、Orders、OrderItems、Products等模型)中的各种结合的灵活性。 首先我们要定义这些模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Ext.define( "User" , {
     extend: 'Ext.data.Model' ,
     fields: [
         'id' , 'name'
     ],
 
     hasMany: {model: 'Order' , name: 'orders' },
 
     proxy: {
         type: 'rest' ,
         url : 'users.json' ,
         reader: {
             type: 'json' ,
             root: 'users'
         }
     }
});
 
Ext.define( "Order" , {
     extend: 'Ext.data.Model' ,
     fields: [
         'id' , 'total'
     ],
 
     hasMany  : {model: 'OrderItem' , name: 'orderItems' , associationKey: 'order_items' },
     belongsTo: 'User'
});
 
Ext.define( "OrderItem" , {
     extend: 'Ext.data.Model' ,
     fields: [
         'id' , 'price' , 'quantity' , 'order_id' , 'product_id'
     ],
 
     belongsTo: [ 'Order' , {model: 'Product' , associationKey: 'product' }]
});
 
Ext.define( "Product" , {
     extend: 'Ext.data.Model' ,
     fields: [
         'id' , 'name'
     ],
 
     hasMany: 'OrderItem'
});

这个可能有很多种理解 - 基本上,一个Usrer拥有多个Orders,而每个Orders是由多个OrderItems组成的。 最后,每个OrderItem都包含单独一个Product. 这就允许我们重构造数据如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
     "users" : [
         {
             "id" : 123,
             "name" : "Ed" ,
             "orders" : [
                 {
                     "id" : 50,
                     "total" : 100,
                     "order_items" : [
                         {
                             "id"      : 20,
                             "price"   : 40,
                             "quantity" : 2,
                             "product" : {
                                 "id" : 1000,
                                 "name" : "MacBook Pro"
                             }
                         },
                         {
                             "id"      : 21,
                             "price"   : 20,
                             "quantity" : 3,
                             "product" : {
                                 "id" : 1001,
                                 "name" : "iPhone"
                             }
                         }
                     ]
                 }
             ]
         }
     ]
}


该JSON响应就是多级嵌套- 将返回所有的Users(在本例中为简单起见,只写了一个User), 每个User中的Orders的所有项(一样只写其中一个为例), 每个Order中的OrderItems的所有项(本例中显示了2个order项),最后Product通过每个OrderItem关联在一起. 现在我们可以读取数据并使用它通过如下方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var store = Ext.create( 'Ext.data.Store' , {
     model: "User"
});
 
store.load({
     callback: function () {
         //被加载的user
         var user = store.first();
 
         console.log( "Orders for " + user.get( 'name' ) + ":" )
 
         //遍历每个User中的Orders
         user.orders().each( function (order) {
             console.log( "Order ID: " + order.getId() + ", which contains items:" );
 
             //遍历每个Order中的OrderItems
             order.orderItems().each( function (orderItem) {
                 //我们都知道Product数据已经被加载,所以我们可以使用同步方法getProduct
                 //一般来说,我们会使用异步版本的 (参考 Ext.data.association.BelongsTo)
                 var product = orderItem.getProduct();
 
                 console.log(orderItem.get( 'quantity' ) + ' orders of ' + product.get( 'name' ));
             });
         });
     }
});


运行以上代码,结果如下:

1
2
3
4
Orders for Ed:
Order ID: 50, which contains items:
2 orders of MacBook Pro
3 orders of iPhone

























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值