使用Solr和JsonRest使用自定义Dojo小部件填充OnDemandGrid
Populating OnDemandGrid with custom Dojo widget using Solr and JsonRest
我有一个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风格来实现这一点(它们都有效),但当我尝试将小部件渲染到网格时,什么都没有显示,我得到了一个TypeError: transform(...) is null
。
有什么原因不能将我的小部件呈现到网格中吗?
我在尝试将Solr结果与dgrid和JsonRest一起使用时遇到了同样的问题
JsonRest使用QueryResults作为其返回内容的包装器
您的问题是QueryResults只接受数组或promise,而您当前正在给它一个对象。
为了给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。
edit:OnDemandGrid无法使用分页扩展
因此,决定您是想要谨慎的分页控制还是无限滚动(由dgrid处理的分页)
请参阅分页和OnDemand文档。
相关文章:
- Dojo不解析自定义小部件的模板html中的小部件声明性
- 在Dojo构建期间,在最小化期间关闭文件编译
- 从另一个dojo模板窗口小部件调用dojo模板小部件中的函数
- 在Dojo中创建小部件
- Dojo将索引0处的数据从数组绑定到小部件
- 如何将一个小部件添加到 DOJO 中的另一个小部件
- Dojo 加载器不加载回调中使用的小部件依赖项
- 将 onClick 侦听器连接到 Dojo 小部件
- 重新初始化(或重新声明)Dojo小部件
- Dojo:用Options以声明方式定义类似Select的小部件
- Dojo:小部件实例共享相同的变量
- Dojo 小部件:如何设置小部件内文件的 url
- Dojo:我可以将两个或多个小部件添加到同一个边界容器区域吗?
- 同步相互依赖的 Dojo 小部件/值
- 如何通过按 id 注册但未在任何 DOM 节点中引用来删除 dojo 小部件
- DOJO 获取小部件的 ID
- DOJO dijit/registry registry.byId() 不监视小部件
- Dojo 1.9:placeAt 在父小部件启动时自动调用启动
- 使用 Dojo 禁用 DIV 中的所有小部件
- Dojo ValidationTextArea 小部件在无效时如何突出显示