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

标签 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();

我的渲染函数:

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 风格(并且它们都有效)来执行此操作,但是当我尝试将小部件渲染到网格时,没有任何显示,并且我得到一个 类型错误:transform(...) 为 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 为止。

编辑:OnDemandGrid 无法与分页扩展一起使用。
因此,请决定是否需要谨慎的分页控件或无限滚动(由 dgrid 处理分页)。
请参阅PaginationOnDemand文档。

关于javascript - 使用 Solr 和 JsonRest 使用自定义 Dojo 小部件填充 OnDemandGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17790880/

相关文章:

javascript - hw 我可以比较两个 perl 哈希(键和值)提取差异并应用于 javascript 中的哈希

javascript - 重新排列数组中每个元素的顺序

rest - Elasticsearch中有多个索引/类型吗?

Javascript:Array.prototype 方法是否适用于 Float32 多维数组

javascript - Knockout.js——理解 foreach 和 with

javascript - 使用 javascript 预加载图像不起作用

REST 上传形状文件

javascript - Animate CSS Flip 上的双面图像

python - 序列化 Django 模型对象 : Referencing to self

c# - 如何在MVC4的Web API中设计非CRUD操作?