2012-06-12 36 views
8

Câu hỏi của tôi là cách lấy siêu dữ liệu ngoài totalRecords, trong trường hợp của tôi là phiên bản, mã, tìm kiếm (hãy xem json).Cách định cấu hình ExtJS 4 Store (proxy và trình đọc) để đọc siêu dữ liệu

{ 
"result": { 
    "version":"1", 
    "code":"200", 
    "searchquery": "false", 
    "totalRecords": "2", 
    "account":[ 
      { 
       "lastname": "Ivanoff", 
       "firstname": "Ivan", 
       "accountId":"1" 
      }, 
      { 
       "lastname": "Smirnoff", 
       "firstname": "Ivan", 
       "accountId":"2" 
      } 
     ] 
} 

}

Đây là mô hình của tôi:

Ext.define("test.Account", { 
    extend: "Ext.data.Model", 
    fields: [ 
     {name: 'accountId', type: 'string'}, 
     {name: 'lastname', type: 'string'}, 
     {name: 'firstname', type: 'string'}  
    ] 
}); 

Và cửa hàng:

Ext.define("test.TestStore", { 
    extend: "Ext.data.Store", 
    model: "test.Account", 
    proxy: { 
     type: "ajax", 
     url: "users.json", 
     reader: { 
      type : 'json', 
      root : 'result.account', 
      totalProperty: "result.totalRecords" 
     } 
    }, 

    listeners: { 
     load: function(store, records, success) { 
      console.log("Load: success " + success);  
     } 
    } 
}); 

Sử dụng cửa hàng này tôi có thể tải hồ sơ (tài khoản) và không thể tìm thấy bất kỳ phương pháp để truy cập phần còn lại của các trường.

Cảm ơn bạn trước.

Trả lời

1

Hãy xem Ext.data.Proxy lớp và cụ thể hơn phương pháp processResponse(). Nếu bạn cần trích xuất bất kỳ dữ liệu bổ sung nào - bạn sẽ phải mở rộng lớp tiêu chuẩn và thay đổi phương thức đó.

+0

i kiểm tra lớp proxy. http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.proxy.Proxy - không tìm phương thức 'processResponse()' ở đó. tôi đang tìm một trong Ext.form.action.Action. Bạn có thể làm cho câu trả lời này bit rõ ràng hơn không. – Jom

+0

kiểm tra lớp 'Ext.data.proxy.Server' trong 4.0.7 (tôi nghĩ OP có ExtJs4 không 4.1 - nhưng chúng tương đối giống nhau) – sha

+0

cảm ơn bạn đã sử dụng phương pháp processResponse nhưng tôi đang làm việc với phiên bản 4.1 và đã quyết định không chạm vào các tệp khuôn khổ. Tuy nhiên tôi đã tìm thấy một giải pháp khác cho vấn đề của mình. Lớp proxy có sự kiện afterRequest, xử lý sự kiện này tôi có thể nhận dữ liệu phản hồi với tất cả trường siêu dữ liệu. – barmaleikin

17

Đây là giải pháp cho vấn đề của tôi. Tôi đang xử lý sự kiện afterRequest trong lớp Proxy nơi tôi có thể nhận dữ liệu phản hồi, phân tích cú pháp và lưu siêu dữ liệu. Đây là một phần proxy của lớp TestStore:

Vì vậy, đây là một phần proxy từ lớp TestStore:

proxy: { 
     type: "ajax", 
     url: "/users.json", 
     reader: { 
      type : 'json', 
      root : 'gip.account', 
      totalProperty: "gip.totalRecords", 
      searchquery: "searchquery" 
     }, 
     afterRequest: function(req, res) { 
      console.log("Ahoy!", req.operation.response);  
     } 
    } 
+0

bạn có thể đánh dấu mục này là câu trả lời! – Jom

+0

Vâng, đây là cách chính xác để làm điều đó. – Reimius

3

Có thể sử dụng 'metachange' sự kiện của cửa hàng.

Tất cả các thông tin cụ thể không ExtJS có thể được nhóm trong JSON trong đối tượng riêng biệt:

{ 
    "result": { 
     "totalRecords": "2", 
     "account":[ 
      { 
       "lastname": "Ivanoff", 
       "firstname": "Ivan", 
       "accountId":"1" 
      }, 
      { 
       "lastname": "Smirnoff", 
       "firstname": "Ivan", 
       "accountId":"2" 
      } 
     ] 
    }, 
    "myMetaData": { 
     "version":"1", 
     "code":"200", 
     "searchquery": "false" 
    } 
} 

Các cửa hàng được cấu hình như

Ext.define("test.TestStore", { 
    extend: "Ext.data.Store", 
    model: "test.Account", 
    proxy: { 
     type: "ajax", 
     url: "users.json", 
     reader: { 
      type : 'json', 
      root : 'result.account', 
      totalProperty: "result.totalRecords", 
      metaProperty: 'myMetaData' 
     } 
    }, 

    listeners: { 
     metachange: function(store, meta) { 
      console.log("Version " + meta.version + "Search query " + meta.searchQuery);  
     } 
    } 
}); 
Các vấn đề liên quan