Kendo-UI DataSource.read() 并不总是发出 GET 请求

Kendo-UI DataSource.read() not always making a GET request

我确实有一个 kendo 数据源,它填充了一个 kendo 模板。

var remoteTemplate = kendo.template($("#remotetemplate").html(), { 
useWithBlock: false });

var remoteDatasource = new kendo.data.DataSource({    

    transport: {
        read: {
            url: 'Home/RemoteData',                    
        }
    },
    change: function () {
        $("#remotemovies tbody").html(kendo.render(remoteTemplate, this.view()));
    }
});

当我们调用读取方法remoteDatasource.read()

时,向Home/RemoteData发出了GET请求

再读一次,向 Home/RemoteData 发出另一个请求 我知道这不好,但我试图理解这一点 :-) remoteDatasource.read()

到目前为止一切顺利,但是我再次调用 read() 时,GET 请求是 没有发生。这是为什么? remoteDatasource.read()

无论我调用多少次这里都没有Get请求

我还注意到 fetch() 方法有相同的行为。

谁能解释一下为什么会这样?还有读取和获取之间的区别是什么。

read()方法应该每次都请求远程服务。

fetch()方法只在第一次请求远程服务。

您的特定 read() 可能不会请求远程服务,因为它正在缓存。您可以尝试将您的请求作为 POST 还是将 transport.read.cache 中的配置设置为 false?

http://docs.telerik.com/kendo-ui/api/javascript/data/datasource#configuration-transport.read.cache

您的 change 回调或任何其他 Javascript 是否抛出异常?尝试删除 change 处理函数。我在过去看到过一些问题,如果在 DataSource 尝试处理服务器响应时抛出未捕获的异常,那么数据源将处于一种状态,它认为先前的请求仍然是 运行(因为它由于错误而从未完成)并且不会执行另一个请求。

似乎优化了行为 Kendo 如果您在连续的行中调用 datasource.read() 则将调用次数限制为两次。这是公平的,因为在实际情况下不需要有这样的代码。

这是我写的两种代码。

场景 1:调用 datasource.read() 以响应按钮点击。

    $("#remoteRequestBtn").click(function () {
        var remoteTemplate = kendo.template($("#remotetemplate").html(), { useWithBlock: false });

        var remoteDatasource = new kendo.data.DataSource({
            transport: {
                read: {
                    cache: false,
                    url: 'Home/RemoteData',
                }
            },
            change: function () {
                $("#remotemovies tbody").html(kendo.render(remoteTemplate, this.view()));
            }
        });

        remoteDatasource.read();

    }); 

结果:每当我单击按钮时,都会向网络调用 Get 请求 api。

场景 2:调用多个 datasource.read() 以响应按钮点击。

$("#remoteRequestBtn").click(function () {
        var remoteTemplate = kendo.template($("#remotetemplate").html(), { useWithBlock: false });

        var remoteDatasource = new kendo.data.DataSource({
            transport: {
                read: {
                    cache: true,
                    url: 'Home/RemoteData',
                }
            },
            change: function () {
                $("#remotemovies tbody").html(kendo.render(remoteTemplate, this.view()));
            }
        });

        remoteDatasource.read();
        remoteDatasource.read();
        remoteDatasource.read();
        remoteDatasource.read();

    });

注意:我调用了 read 方法 4 次,现在如果你问我这是否有效 :-) 不是 :-)

结果:在这种情况下,我只收到两个 GET 请求(对于第一个和第二个 read(),其余的读取被忽略)

到目前为止,我想将此视为 Kendo-UI 方面的优化,除非有人回来纠正它。

特别感谢 JFlok 和 CodingWithSpike 给予正确的指导。