我有一个OnDemandGrid,其中有一列我想用我构建的自定义Dojo小部件填充。用于填充每个小部件的数据来自Solr查询。由于我期待可能有数千个搜索结果,我需要使用JsonRest对象来进行查询和处理分页。这是我到目前为止所做的:
商店:
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;
}
以JSON形式的样本Solr响应:
{
"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风格(并且它们都有效),但是当我尝试将小部件渲染到网格时,没有任何显示,我得到了{{ 1}}。
我有什么理由不能将我的小部件渲染到网格中吗?
答案 0 :(得分: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);
}
});
});
我还建议您在正确填充dgrid之后等待使用自定义renderCell函数。
编辑:OnDemandGrid不适用于分页扩展。
因此,决定是否需要谨慎的分页控制或无限滚动(由dgrid处理的分页)
请参阅Pagination和OnDemand文档。