【问题标题】:Unable to access data array in Kendo grid datasource无法访问 Kendo 网格数据源中的数据数组
【发布时间】:2015-09-25 18:35:13
【问题描述】:

背景故事:

我正在尝试对我正在使用他们的 Mvc 包装器制作的剑道网格进行一些自定义验证。我想根据当前数据检查用户的输入,以确保用户没有复制条目。为此,我需要访问 Grid 的数据数组。

我的代码:

@using Kendo.Mvc.UI
@model ViewModel.SecurityManagementViewModel


<div class="container containerOuterBorder">
    <div class="containerBorder">
        <div class="pageTitle">Users</div>
    </div>

    @(Html.Kendo().Grid<User>()
        .Name("Users")
        .Columns(columns =>
        {
            columns.Bound(c => c.LastName).Title("Last Name");
            columns.Bound(c => c.FirstName).Title("First Name");
            columns.Bound(c => c.WindowsId).Title("Windows Id");
            columns.Bound(c => c.Email).Title("Email");
            columns.Bound(c => c.RoleId).Title("Access Role")
                .EditorTemplateName("SecurityManagementEditor").ClientTemplate("#:RoleName#");
            columns.Command(command =>
            {
                command.Edit();
                command.Destroy();
            });
        })
        .ToolBar(toolbar =>
        {
            toolbar.Create().Text("Add New User");
            toolbar.Custom().Text("Manage Roles").Url("/Admin/SecurityRoles");
        })
        .Editable(editable => editable.Mode(GridEditMode.InLine))
        .Sortable()
        .DataSource(dataSource => dataSource
            .Ajax()
            .ServerOperation(false)
            .Model(model => model.Id(u => u.UserId))
            .Create(update => update.Action("SecurityManagement_Create", "Admin"))
            .Read(read => read.Action("SecurityManagement_Read", "Admin"))
            .Update(update => update.Action("SecurityManagement_Update", "Admin"))
            .Destroy(update => update.Action("SecurityManagement_Destroy", "Admin"))
        )
    )

</div>

<script>
    $(document).ready(function () {
        //logging the grid
        console.log($("#Users").data().kendoGrid);

        //logging the data, by various means
        console.log($("#Users").data().kendoGrid.dataSource.view());
        console.log($("#Users").data().kendoGrid.dataSource._data);
        console.log($("#Users").data("kendoGrid")._data);

        //logging the columns (successful)
        console.log($("#WFMUsers").data("kendoGrid").columns);
    });
</script>

问题:

当我尝试从网格的数据源访问数据数组时,响应总是以某种方式为空。更令人沮丧的是,通过记录网格本身,我可以看到已经加载的数据。我还可以轻松访问其他属性,例如列。

日志:

网格对象。显然,_data 数组已填充

网格中包含的对象。我可以看到他们!

最后 4 行的结果。前 3 个,试图访问 _data,都是空的。最后一个,访问列,返回没有问题。

我试过了:

  • 代码的多种表述方式。
  • 重新启动 Visual Studio
  • 在 FireFox、Chrome 和 IE 上运行
  • 重新启动我的电脑

【问题讨论】:

  • 我无法理解您的问题?什么时候可以访问数据源,什么时候不能?

标签: kendo-ui kendo-grid


【解决方案1】:

记录条目的脚本在 $(document).ready() 函数中执行。 这意味着,此时 DOM 已准备就绪,但网格数据是通过 Ajax 加载的,因此此时尚未填充网格。但是,这些列是可用的,因为它们是网格配置的一部分。

如果您在填充网格后在浏览器控制台中键入 console.log($("#Users").data().kendoGrid.dataSource.view());,您应该查看相应的条目。

为确保数据被加载,您可以使用网格的 dataBound 事件。这在加载数据时触发。 (见Kendo Documentation

【讨论】:

  • 那么,为什么我在记录网格时能够看到填充的网格数据,但在记录数据时却看不到?
  • 我假设您在浏览器控制台中查看网格对象。可能会发生以下情况(这只是猜测): 在您记录网格的时间点,数据尚不可用。浏览器控制台将显示没有数据的网格对象。加载数据后,设置网格的_data属性。随着网格对象的更新,控制台将显示更新的数据。因此,当您查看对象时,您将始终看到它现在的状态,而不是它被记录时的状态。
  • 啊,这很有道理(并解释了其他一些事情)。谢谢!
猜你喜欢
  • 2014-02-10
  • 2021-04-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多