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

时间:2013-07-22 15:00:06

标签: javascript json rest solr dojo

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

我有什么理由不能将我的小部件渲染到网格中吗?

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处理的分页) 请参阅PaginationOnDemand文档。