剑道网格 - 如何在添加/编辑子行时访问父行模型(详细网格)

Posted

技术标签:

【中文标题】剑道网格 - 如何在添加/编辑子行时访问父行模型(详细网格)【英文标题】:Kendo grid - How to get access to Parent row model on add / edit child row (detail grid) 【发布时间】:2018-02-03 08:57:36 【问题描述】:

我正在使用 Kendo 分层网格在我的父(主)网格中显示类别,并将产品显示为子行(详细网格)。

这是我的DEMO

我正在使用自定义模板来添加/编辑我的产品。

在弹出的表单中,我想在 Product 表单字段上方的标签中显示父类别名称及其一些详细信息。

现在在每个产品添加或编辑中,我想在表单中显示父类别的详细信息,并且还想通过产品创建/更新请求动态提交父类别 ID

在我下面的 JS 代码中,我可以使用下面的代码访问当前的详细信息网格包装器,但不知道如何访问parent row model 详细信息

.....
.......

function detailInit(e) 
    $("<div/>").appendTo(e.detailCell).kendoGrid(

    ....
    ......
    //ON CLICK ADD/EDIT BUTTON FOR CHILD ROWS
    edit: function(e) 

        var detailGridWrapper = this.wrapper;

        //Want to get Parent Category model
        //Retrieve some attributes out of the Category model, so that I can display them in the popup Add / Edit Product form

........
.....

【问题讨论】:

【参考方案1】:

使用$(detailGridWrapper).closest("tr").prev() 可以获得父网格当前行,一个用户已经展开。然后用$("#grid").data("kendoGrid").dataItem()就可以得到父网格当前模型:

var detailGridWrapper = this.wrapper,
    mainGrid = $("#grid").data("kendoGrid"),
    $parentGridTr = $(detailGridWrapper).closest("tr").prev(),
    parentData = mainGrid.dataItem($parentGridTr);

    console.log(parentData);

Updated demo

请注意,当您横穿最近的 TR 时,您实际上得到的是详细信息行而不是实际数据行。因此,您需要获取数据行——即当.prev() 出现时——为.dataItem() 获取正确的行。

【讨论】:

A +1 为您的努力伙伴,但您的回答仍然需要一些努力,因为我需要从 parentModel 检索属性并将它们设置到弹出表单中。此外,这段代码行:mainGrid = $("#grid").data("kendoGrid"),如果我们在同一页面上有多个网格,则将不起作用 @RahulGupta 好吧,我的回答是基于你的问题,对我来说似乎有一个问题:获取父数据。然后,你可以用它创建弹出窗口,所以我让你来做。而且我找不到它在哪里定义了多个网格,即使在小提琴中也只有一个。无论如何,我很高兴你找到了解决方案。【参考方案2】:

这是我最终如何实现它的DEMO

JS代码sn-p:

.....
.......

function detailInit(e) 
    $("<div/>").appendTo(e.detailCell).kendoGrid(

    ....
    ......
    //ON CLICK ADD/EDIT BUTTON FOR CHILD ROWS
    edit: function(e) 

        //alert('clciked');
        var detailGridWrapper = this.wrapper;
        // GET PARENT ROW ELEMENT
        var parentRow = detailGridWrapper.closest("tr.k-detail-row").prev("tr");
        // GET PARENT GRID ELEMENT
        var parentGrid = parentRow.closest("[data-role=grid]").data("kendoGrid");
        // GET THE PARENT ROW MODEL
        var parentModel = parentGrid.dataItem(parentRow);

        // Retrieve Parent Category data out of the model
        var CategoryId = parentModel.CategoryId;
        var CategoryName = parentModel.Name;

        // HERE e.container IS THE ADD/EDIT POPUP FORM ELEMENT
        e.container
        .find("#span_CategoryId") // get the span element for the field
        .html(CategoryId) // set the value
        .change(); // trigger change in order to notify the model binding

        e.container
        .find("#span_CategoryName") // get the span element for the field
        .html(CategoryName) // set the value
        .change(); // trigger change in order to notify the model binding
    

【讨论】:

【参考方案3】:

我在这方面有点晚了。对我来说,这很好用而且很干净。 也许它仍然对某人有帮助。

电子数据

function detailInit(e) 
//Right here
var CategoryId = e.data.CategoryId;
var parentEvent = e;

$("<div/>").appendTo(e.detailCell).kendoGrid(
    edit: function(e) 
        //Or here
        var CategoryId = parentEvent.data.CategoryId;
    
    );

【讨论】:

以上是关于剑道网格 - 如何在添加/编辑子行时访问父行模型(详细网格)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 函数编辑剑道网格中的特定绑定列

在详细单击列标题时编辑剑道网格中的主列标题

如何制作可编辑的假剑道网格特定列?

如何在添加窗口中通过 html 助手更改弹出剑道网格的标题

如何从编辑器中排除不在数据源中的剑道网格字段?

禁用剑道网格中的编辑