使用Solr和JsonRest使用自定义Dojo小部件填充OnDemandGrid

Populating OnDemandGrid with custom Dojo widget using Solr and JsonRest

本文关键字:小部 Dojo 填充 OnDemandGrid 自定义 Solr JsonRest 使用      更新时间:2023-09-26

我有一个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文档。