2012-06-12 14 views
10

Tôi đang cố tạo lớp Dynamic Grid (nơi tôi không biết bất kỳ thông tin nào về các cột nhưng chúng được đưa ra từ phản hồi json và gird tự chuẩn bị tương ứng). Here Tôi đã tìm thấy chính xác những gì tôi đang tìm kiếm tuy nhiên nó mang lại cho tôi một lỗi:Tạo Lưới động với ExtJS

me.model is undefined 
me.setProxy(me.proxy || me.model.getProxy()); 
ext-all-debug.js (line 47323) 

Tôi đã cố gắng thêm cả proxy và mô hình nhưng tôi đã không thành công, tôi vẫn tiếp tục nhận được lỗi tương tự.

Đây là mã ExtJS mà tôi đang làm việc trên:

// ExtJS 4.1 
Ext.Loader.setConfig({ 
    enabled: true 
}); 
Ext.Loader.setPath('Ext.ux', '../extjs-4.1.0/examples/ux'); 
Ext.require([ 
    'Ext.grid.*', 
    'Ext.data.*', ]); 


Ext.define('DynamicGrid', { 
    extend: 'Ext.grid.GridPanel', 
    storeUrl: '', 
    enableColumnHide: true, 
    initComponent: function() { 
     var store = new Ext.data.Store({ 
      url: this.storeUrl, 
      reader: new Ext.data.JsonReader(), 
      autoLoad: true, 
      scope: this, 
      listeners: { 
       scope: this, 
       metachange: function (store, meta) { 
        if (typeof (store.reader.jsonData.columns) === 'object') { 
         var columns = []; 
         /** 
          * Adding RowNumberer or setting selection model as CheckboxSelectionModel 
          * We need to add them before other columns to display first 
          */ 
         if (this.rowNumberer) { 
          columns.push(new Ext.grid.RowNumberer()); 
         } 
         if (this.checkboxSelModel) { 
          columns.push(new Ext.grid.CheckboxSelectionModel()); 
         } 
         Ext.each(store.reader.jsonData.columns, function (column) { 
          columns.push(column); 
         }); // Set column model configuration 
         this.getColumnModel().setConfig(columns); 
         this.reconfigure(store, this.getColumnModel()); 
        } 
       } 
      } 
     }); 
     var config = { 
      title: 'Dynamic Columns', 
      viewConfig: { 
       emptyText: 'No rows to display' 
      }, 
      loadMask: true, 
      border: false, 
      stripeRows: true, 
      store: store, 
      columns: [] 
     } 
     Ext.apply(this, config); 
     Ext.apply(this.initialConfig, config); 
     DynamicGrid.superclass.initComponent.apply(this, arguments); 
    }, 
    onRender: function (ct, position) { 
     this.colModel.defaultSortable = true; 
     DynamicGrid.superclass.onRender.call(this, ct, position); 
    } 
}); 

Ext.onReady(function() { 

    Ext.QuickTips.init(); 

    var grid = Ext.create('DynamicGrid', { 
     storeUrl: 'http://300.79.103.188/ApplicationJs/jsontest.json' 
    }); 

    var depV = Ext.create('Ext.Viewport', { 
     title: 'Departman Tanımları', 
     layout: 'fit', 
     items: grid 
    }).show(); 

}); 

gì tôi phải làm inorder để làm cho nó chạy?

Trả lời

9

Đó là một bài đăng khá cũ để bạn có thể có nhiều cách giải quyết sớm, nhưng lỗi đó là do bạn không có model config hoặc fields config được xác định cho cửa hàng của mình. Mô hình cũng sẽ cần phải được xác định động nếu bạn muốn lưới của mình được tạo với dữ liệu json một mình. Theo như tôi biết, các cấu hình trường là khá tha thứ, vì vậy bạn có thể chỉ cần thiết lập điều này với số lượng trường tối đa có thể là 20 hoặc 30 hoặc hơn, nhưng tên trường sẽ phải khớp với tên trường json để có thể sử dụng được. I E. nếu bạn sử dụng:

var store = new Ext.data.Store({ 
    url: this.storeUrl, 
    reader: new Ext.data.JsonReader(), 
    fields: [ 
     'column1', 
     'column2', 
     'column3', 
     'column4', 
     'column5', 
     // etc 
    ], 

Sau đó, dữ liệu json của bạn sẽ cần phải xuất phát từ cơ sở dữ liệu như:

[{"column1":"data1", "column2":"data2", // etc 

Một điều tôi đã thực hiện trong quá khứ là phải có một cửa hàng tham khảo nạp đầu tiên trong đó có một bản ghi với tên và kiểu dữ liệu cho mỗi trường động (dữ liệu meta). Sau đó, tôi lặp qua cửa hàng tham chiếu này và added a model field định nghĩa cột tại mỗi lần lặp lại, rồi Tôi đã tải cửa hàng của lưới hiện đã có mô hình dữ liệu chính xác được xác định và lưới sẽ có độ lệch cột chính xác.

Bạn có thể làm điều gì đó như thế nếu bạn không muốn đặt tên cột chung về cơ sở dữ liệu của mình như được đề cập ở trên, vì tôi không biết cách bạn sẽ tải dữ liệu vào cửa hàng lưới của mình ban đầu trước bạn cung cấp cho nó một mô hình dữ liệu để sử dụng.

CẬP NHẬT 13 tháng 6:

Tôi đã không thử nó chưa, nhưng tôi chỉ đi qua this in the 4.1 docs (di chuyển xuống phần "đáp ứng MetaData" trong phần intro). Nó mô tả bằng cách sử dụng metaData trong phản hồi json của bạn để thực hiện chính xác những gì bạn đang làm với một cột mô hình động và lưới.

Bạn có thể vẫn phải thực hiện phép lặp mà tôi đã mô tả ở trên khi bạn xử lý siêu dữ liệu, nhưng bạn có thể sử dụng nó để cắt bỏ yêu cầu bổ sung đó để lấy dữ liệu meta.

Tôi cho rằng nếu cấu hình trường của bạn không thay đổi theo từng yêu cầu thì sẽ dễ dàng hơn khi thực hiện yêu cầu bổ sung ngay từ đầu, nhưng nếu bạn muốn thứ gì đó thực sự năng động thì điều này sẽ thực hiện.

+0

"Response MetaData". – ilhan

+0

Tôi tin rằng OP đã đề cập đến các tài liệu cho Ext.data.reader.Json - trong 4.2 một http://docs.sencha.com/extjs/4.2.0/#!/api/Ext.data.reader.Json – Sarge

+0

@Sarge 4.2 không được phát hành tại thời điểm bài đăng – Geronimo

3

LƯU Ý: Đây là bản sao của phản hồi của tôi tại đây: How do you create table columns and fields from json? (Dynamic Grid). Tôi chỉ muốn giải quyết giải pháp cuối cùng của mình trong tất cả các câu hỏi về StackOverflow mà tôi đã sử dụng để giải quyết vấn đề này.

Stackoverflow được rải rác với các câu hỏi rất giống với câu hỏi này. Tôi đã làm việc thông qua tất cả và không tìm thấy một giải pháp dứt khoát. Tuy nhiên, hầu hết các câu trả lời được cung cấp chỉ cho tôi đi đúng hướng. Tôi sẽ đưa cho tôi bức ảnh đẹp nhất tại đặt tất cả những lời đề nghị với nhau và làm cho rõ ràng này cho người khác:

mẫu: (. Chỉ thấy 2 lĩnh vực mà sẽ được ở tất cả các phản ứng JSON sẽ vẫn được ghi đè)

Ext.define('RTS.model.TestsModel', { 
    extend: 'Ext.data.Model', 
    alias: 'model.TestsModel', 

    fields: [ 
     { 
      name: 'poll_date' 
     }, 
     { 
      name: 'poller' 
     } 
    ] 
}); 

Store:

Ext.define('RTS.store.TestsStore', { 
    extend: 'Ext.data.Store', 
    alias: 'store.TestsStore', 

    model: 'RTS.model.TestsModel', 

    constructor: function(cfg) { 
     var me = this; 

     cfg = cfg || {}; 

     me.callParent([Ext.apply({ 
      autoLoad: false, 
      proxy  : { 
       type : 'ajax', 
       url  : 'tests.php', 
       reader : { 
        type : 'json', 
        root : 'tests', 
        successProperty : 'success' 
       } 
      },    
      storeId: 'tests-store' 
     }, cfg)]); 
    } 
}); 

Xem: (Các cột sẽ được xác định trong mỗi câu trả lời JSON)

Ext.define('RTS.view.TestsView', { 
    extend: 'Ext.grid.Panel', 
    alias: 'widget.TestsView', 

    id: 'tests-view', 
    title: 'Tests', 
    emptyText: '', 
    store: 'TestsStore', 

    initComponent: function() { 
     var me = this; 

     Ext.applyIf(me, { 
      viewConfig: { 

      }, 
      columns: [ 
      ] 
     }); 

     me.callParent(arguments); 
    } 

}); 

Bộ điều khiển: (Bộ điều khiển làm hết mọi việc trong buộc quan điểm và mô hình để thay đổi dựa trên phản ứng JSON).

Ext.define('RTS.controller.TestsController', { 
    extend: 'Ext.app.Controller', 
    alias: 'controller.TestsController', 

    stores: [ 
     'TestsStore' 
    ], 
    models: [ 
     'TestsModel' 
    ], 
    views: [ 
     'TestsView' 
    ], 

    init: function(application) { 

     // When store changes, trigger an event on grid 
     // to be handled in 'this.control'. 

     // NOTE : Ext JS does not allow control of 
     // non-component events. 

     // Ext JS 4.2 beta will allow the controller 
     // to detect non-component changes and handle them 
     var testsStore = this.getStore('TestsStore'); 
     testsStore.on("metachange", metaChanged, this); 
     function metaChanged(store, meta) { 
      var grid = Ext.ComponentQuery.query('TestsView')[0]; 
      grid.fireEvent('metaChanged', store, meta); 
     }; 


     this.control({ 
      "TestsView": { 
       metaChanged: this.handleStoreMetaChange 
      } 
     }); 
    }, 

    /** 
    * Will update the model with the metaData and 
    * will reconfigure the grid to use the 
    * new model and columns. 
    */ 
    handleStoreMetaChange: function(store, meta) { 
     var testsGrids = Ext.ComponentQuery.query('TestsView')[0]; 
     testsGrids.reconfigure(store, meta.columns); 
    } 

}); 

JSON đáp ứng: phản ứng json của bạn phải có những "siêu dữ liệu" bất động sản bao gồm. Nó sẽ xác định các trường giống như bạn làm trên một mô hình tĩnh và khung nhìn thường được định nghĩa để hiển thị các trường.

{ 
    "success": true, 
    "msg": "", 
    "metaData": { 
     "fields": [ 
      { 
       "name": "poller" 
      }, 
      { 
       "name": "poll_date" 
      }, 
      { 
       "name": "PING", 
       "type": "int" 
      }, 
      { 
       "name": "SNMP", 
       "type": "int" 
      }, 
      { 
       "name": "TELNET", 
       "type": "int" 
      }, 
      { 
       "name": "SSH", 
       "type": "int" 
      }, 
      { 
       "name": "all_passed" 
      } 
     ], 
     "columns": [ 
      { 
       "dataIndex": "poller", 
       "flex": 1, 
       "sortable": false, 
       "hideable": false, 
       "text": "Poller" 
      }, 
      { 
       "dataIndex": "poll_date", 
       "flex": 1, 
       "sortable": false, 
       "hideable": false, 
       "text": "Poll Date" 
      }, 
      { 
       "dataIndex": "PING", 
       "flex": 1, 
       "sortable": false, 
       "hideable": false, 
       "text": "PING", 
       "renderer": "RenderFailedTests" 
      }, 
      { 
       "dataIndex": "SNMP", 
       "flex": 1, 
       "sortable": false, 
       "hideable": false, 
       "text": "SNMP", 
       "renderer": "RenderFailedTests" 
      }, 
      { 
       "dataIndex": "TELNET", 
       "flex": 1, 
       "sortable": false, 
       "hideable": false, 
       "text": "TELNET", 
       "renderer": "RenderFailedTests" 
      }, 
      { 
       "dataIndex": "SSH", 
       "flex": 1, 
       "sortable": false, 
       "hideable": false, 
       "text": "SSH", 
       "renderer": "RenderFailedTests" 
      }, 
      { 
       "dataIndex": "all_passed", 
       "flex": 1, 
       "sortable": false, 
       "hideable": false, 
       "text": "All Passed", 
       "renderer": "RenderFailedTests" 
      } 
     ] 
    }, 
    "tests": [ 
     { 
      "poller": "CHI", 
      "poll_date": "2013-03-06", 
      "PING": "1", 
      "SNMP": "0", 
      "TELNET": "1", 
      "SSH": "0", 
      "all_passed": "0" 
     }, 
     { 
      "poller": "DAL", 
      "poll_date": "2013-03-06", 
      "PING": "1", 
      "SNMP": "0", 
      "TELNET": "1", 
      "SSH": "0", 
      "all_passed": "0" 
     }, 
     { 
      "poller": "CHI", 
      "poll_date": "2013-03-04", 
      "PING": "1", 
      "SNMP": "0", 
      "TELNET": "1", 
      "SSH": "0", 
      "all_passed": "0" 
     }, 
     { 
      "poller": "DAL", 
      "poll_date": "2013-03-04", 
      "PING": "1", 
      "SNMP": "0", 
      "TELNET": "1", 
      "SSH": "0", 
      "all_passed": "0" 
     }, 
     { 
      "poller": "CHI", 
      "poll_date": "2013-03-01", 
      "PING": "1", 
      "SNMP": "0", 
      "TELNET": "1", 
      "SSH": "0", 
      "all_passed": "0" 
     } 
    ] 
}