Kendo 网格在 Durandal/RequireJS 的某些情况下行为不当
Kendo Grid misbehaving in certain situations with Durandal/RequireJS
背景:
我有一个使用以下技术的现有站点:
ASP.NET MVC5,
KnockoutJS,
Kendo UI 2014.1.318
Web API 2
OData v3
我的站点上有许多 Kendo 网格,都运行良好。直到现在,那是...当我开始整合 Durandal.
问题:
95% 的网格都很好,但有 2 个网格从 OData v3 操作(POST 操作)获取数据。例如:
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
[HttpPost]
public IQueryable<ServiceInfoResult> GetServices(ODataActionParameters parameters)
{
}
是的,这很不寻常,但出于我不会深入探讨的原因,我有来自 OData (POST) Action 的数据。网格通常工作正常,我只需要确保设置以下内容:
schema: {
data: function (data) {
return data.value;
},
total: function (data) {
//return data["odata.count"]; // this is the one normally used for other grids, but not here...
// instead, I need to use the following and do paging locally, which is fine, since there's a VERY small number of records, so there's no issue.
return data.value.length;
},
//etc
}
无论如何,现在我正在使用 Durandal/RequireJS,有些奇怪的事情发生了...;第一次加载时一切看起来都很好,但是当单击页面(2、3、4 等...)时,网格会显示所有记录,即使在网格的页脚它仍然显示 showing 11-20 of 238 items
并有页码。
再一次,我说它之前工作正常。有谁知道为什么会发生这种情况以及我能做些什么吗?
更新
我刚刚发现了一些东西。对于我所有的网格,我在 viewModel 上使用 属性 来指定 gridPageSize
。基本上,我是这样做的:
var ViewModel = function () {
var self = this;
self.gridPageSize = 10;
//etc
self.attached = function () {
//etc
self.gridPageSize = $("#GridPageSize").val(); //this is a hidden field I am using to get the page size which was set in admin area
//etc
}
//etc
在网格配置中,我有:
pageSize: self.gridPageSize,
serverPaging: false,
serverFiltering: false,
serverSorting: false,
//etc
这适用于所有使用服务器端分页的网格。但是,此网格使用客户端分页。我现在所做的只是以下内容:
pageSize: 10,
现在它按预期工作了。这是一个很好的解决方法,但并不完美,因为我无法动态设置页面大小。关于这里发生的事情有什么想法吗?
您可以动态更改网格的 pageSize
。您需要做的就是调用网格 dataSource
的 pageSize()
方法,它应该会按预期工作。
$('#grid').data('kendoGrid').dataSource.pageSize(100);
这不再是问题,因为 OData 5.7 现在 returns @odata.count
actions/functions 返回复杂类型的集合。之前,我关闭了服务器端分页和过滤..只是在客户端获取所有数据,我不喜欢,但别无选择......但现在我可以使用服务器端分页,不需要关心关于这个奇怪的问题了。有关 OData 修复的更多信息:https://github.com/OData/WebApi/issues/484#issuecomment-153929767
背景:
我有一个使用以下技术的现有站点:
ASP.NET MVC5,
KnockoutJS,
Kendo UI 2014.1.318
Web API 2
OData v3
我的站点上有许多 Kendo 网格,都运行良好。直到现在,那是...当我开始整合 Durandal.
问题:
95% 的网格都很好,但有 2 个网格从 OData v3 操作(POST 操作)获取数据。例如:
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
[HttpPost]
public IQueryable<ServiceInfoResult> GetServices(ODataActionParameters parameters)
{
}
是的,这很不寻常,但出于我不会深入探讨的原因,我有来自 OData (POST) Action 的数据。网格通常工作正常,我只需要确保设置以下内容:
schema: {
data: function (data) {
return data.value;
},
total: function (data) {
//return data["odata.count"]; // this is the one normally used for other grids, but not here...
// instead, I need to use the following and do paging locally, which is fine, since there's a VERY small number of records, so there's no issue.
return data.value.length;
},
//etc
}
无论如何,现在我正在使用 Durandal/RequireJS,有些奇怪的事情发生了...;第一次加载时一切看起来都很好,但是当单击页面(2、3、4 等...)时,网格会显示所有记录,即使在网格的页脚它仍然显示 showing 11-20 of 238 items
并有页码。
再一次,我说它之前工作正常。有谁知道为什么会发生这种情况以及我能做些什么吗?
更新
我刚刚发现了一些东西。对于我所有的网格,我在 viewModel 上使用 属性 来指定 gridPageSize
。基本上,我是这样做的:
var ViewModel = function () {
var self = this;
self.gridPageSize = 10;
//etc
self.attached = function () {
//etc
self.gridPageSize = $("#GridPageSize").val(); //this is a hidden field I am using to get the page size which was set in admin area
//etc
}
//etc
在网格配置中,我有:
pageSize: self.gridPageSize,
serverPaging: false,
serverFiltering: false,
serverSorting: false,
//etc
这适用于所有使用服务器端分页的网格。但是,此网格使用客户端分页。我现在所做的只是以下内容:
pageSize: 10,
现在它按预期工作了。这是一个很好的解决方法,但并不完美,因为我无法动态设置页面大小。关于这里发生的事情有什么想法吗?
您可以动态更改网格的 pageSize
。您需要做的就是调用网格 dataSource
的 pageSize()
方法,它应该会按预期工作。
$('#grid').data('kendoGrid').dataSource.pageSize(100);
这不再是问题,因为 OData 5.7 现在 returns @odata.count
actions/functions 返回复杂类型的集合。之前,我关闭了服务器端分页和过滤..只是在客户端获取所有数据,我不喜欢,但别无选择......但现在我可以使用服务器端分页,不需要关心关于这个奇怪的问题了。有关 OData 修复的更多信息:https://github.com/OData/WebApi/issues/484#issuecomment-153929767