2013-07-22 63 views
0

我有一列OnDemandGrid,我想用我構建的自定義Dojo小部件填充一列。用於填充每個這些小部件的數據來自Solr查詢。由於我期待可能有數以千計的搜索結果,因此我需要使用JsonRest對象來進行查詢並處理分頁。這是我到目前爲止有:使用Solr和JsonRest填充OnDemandGrid與自定義Dojo小部件

商店:

var store = new JsonRest ({ 
    target: "/solr/json/response", 
}); 

創建網格:

var grid = new (declare([OnDemandGrid, Pagination])) ({ 
    store: store, 
    getBeforePut: false, 
    columns: [ 
     { 
      label: "Test", 
      field: "first", 
      renderCell: myRenderFunction //To render the custom widget 
     } 
    ] 
}, "grid"); 

grid.startup(); 

myRenderFunction:

var myRenderFunction = function(object, data, cell) { 

    var widget = new MyCustomWidget({ 
     doc: object, 
     foo: bar 
    }, cell.appendChild(document.createElement("div")); 

    widget.startup(); 
    return widget; 
} 

樣品Solr的響應,以JSON形式:

{ 
    "response":{ 
     "docs":[ 
      { 
       "foo": "Hello", 
       "bar": "World" 
      }, 
      { 
       "foo": "Easy as", 
       "bar": "ABC" 
      }, 
      { 
       "foo": "Simple as", 
       "bar": "Do re mi" 
      } 
     ] 
    }, 
    "highlighting": { ... }, 
    "numFound": "74", 
    "start": 0 
} 

我已經在線演示瞭如何使用JsonRest和任何dgrid風格(以及它們都工作)來做到這一點,但是當我嘗試將小部件呈現給網格時,什麼也沒有顯示出來,我得到了一個TypeError: transform(...) is null

是否有任何理由不能將我的小部件呈現給網格?

回答

2

我遇到了同樣的問題,試圖用dgrid和JsonRest來使用Solr結果。
JsonRest使用QueryResults作爲它返回的包裝。
你的問題是,QueryResults只接受數組或承諾,你目前正在給它一個對象。

爲了給QueryResults的docs陣列,編寫自定義JsonRest存儲類似於:

define([ 
    "dojo/Deferred", "dojo/io-query", "dojo/_base/declare", "dojo/request/xhr", 
    "dojo/store/JsonRest", "dojo/store/util/QueryResults" 
], function (Deferred, ioQuery, declare, xhr, JsonRest, QueryResults) { 
    return declare([JsonRest], { 
     target: '/solr/json/response', 
     idProperty: 'foo', 
     query: function (query, options) { 
      var results, total, count = options.count, start = options.start; 
      if (start > 0 || count >= 0) { 
       query.start = start; 
       query.rows = ((options.hasOwnProperty('count') && 
        count !== Infinity) ? count : 25); 
      } else { 
       console.error('Missing start and count arguments'); 
       return; 
      } 
      results = new Deferred(); 
      results.total = new Deferred(); 
      xhr(this.target, { 
       query: ioQuery.objectToQuery(query), 
       handleAs: 'json', 
       headers: { 
        Accept: this.accepts 
       } 
      }).then(function (data) { 
       total = data.response.numFound; 
       results.total.resolve(total); 
       results.resolve(data.response.docs); 
      }, function (e) { 
       console.error(e.response.status + '. ' + e.message); 
      }); 
      return new QueryResults(results); 
     } 
    }); 
}); 

我還建議等待使用自定義功能renderCell,直到你得到dgrid適當填充後。

編輯:OnDemandGrid不會使用分頁擴展。
因此,決定是否需要謹慎的分頁控制或無限滾動(由dgrid處理的分頁)。
請參閱PaginationOnDemand文檔。

相關問題