【问题标题】:Telerik UI MVVM grid misbehaving with checkboxesTelerik UI MVVM 网格与复选框行为不端
【发布时间】:2018-03-12 21:03:50
【问题描述】:

我有一个正在使用的 Telerik UI 网格,但我无法让它在复选框列中完全正常运行。

我想要将它绑定到数据集中的布尔字段。我想用复选框编辑这个项目。只要选择或取消选中复选框,我想在行上执行一些数学。

我搜索了 Stackexchange,发现了一些有用的代码位,但不是 100%。 I've created a JSFiddle to demonstrate the odd behavior.

网格定义如下:

<script type="text/x-kendo-template" id="checkboxTemplate">
    <input type="checkbox" #=Discontinued ? checked="checked" : "" # class="chkbx" />
</script>

<div
    id="LineItemsGrid"
    data-role="grid"
    data-editable="true"
    data-bind="source: LineItems"
    style="height: 470px"
    data-navigatable="true"
    data-columns="[
    { 'field': 'Discontinued', 'title':'<center>Discontinued</center>', 'width': 95, 'template': kendo.template($('#checkboxTemplate').html()) },
    { 'field': 'ProductName', 'title':'<center>Product Name</center>', 'width': 90 },
    { 'field': 'UnitPrice', 'title':'<center>Unit Price</center>', 'width': 90 },
        { 'field': 'UnitsInStock', 'title':'<center>Units In Stock</center>', 'width': 90 },
        { 'field': 'TotalInventory', 'title':'<center>Total Inventory</center>', 'width': 90 }
    ]">
</div>

没什么太花哨的。处理复选框的javascript在这里:

$(document).on('change', 'input:checkbox', function (e) {

    var grid = $("#LineItemsGrid").data("kendoGrid");
    var row = $(this).closest("tr");
    var rowIdx = $("tr", grid.tbody).index(row);
    var colIdx = $("td", row).index(this);

    var checkval = $(this).prop("checked");

    var items = LineItemsSource.data();

    // set data - this causes the move to (0,0)
    items[rowIdx].set("Discontinued", checkval);
    if(checkval)
    {
        var total =  items[rowIdx].get("UnitPrice") * items[rowIdx].get("UnitsInStock");
        items[rowIdx].set("TotalInventory",total);
    }
    else
    {
        items[rowIdx].set("TotalInventory",0);
    }
})

如果您单击复选框,当您 .set() 将值设置为复选框时,它会将插入符号移动到 (0,0)。当您单击复选框旁边的单元格时,它会将复选框向左移动一点并且不会选中它。如果您此时单击它,它会进行编辑并且不会移动到 (0,0)。

我绝对肯定有一种更优雅的方法可以做到这一点,但我没有找到任何线索。

【问题讨论】:

    标签: checkbox mvvm telerik grid


    【解决方案1】:

    您的代码在 jsfiddle 中调试起来有点困难。

    但我为你做了这个,希望它可以帮助你:

    您可以使用数据源和 MVVM 的更改事件,而不是尝试处理 JQuery 事件。

    默认情况下,剑道网格在显示模式下不是 MVVM,只是在编辑模式下。 如果您查看数据绑定事件,这会使您的行即使在视图模式 mvvm 下。

    这是显示它的道场。

    https://dojo.telerik.com/AYEsUSiz/4

    这里是代码

    <div id="grid"></div>
      <script type="text/x-kendo-template" id="checkboxTemplate">
          <input type="checkbox" data-bind="checked: Discontinued" class="chkbx" />
      </script>
      <script>
            $('#grid').kendoGrid({
            dataBound: function(e) {
                let visibleModels = e.sender.dataSource.view();
                var items = e.sender.items();
                for(var i = 0 ; i < items.length; i++) {
                    kendo.bind(items[i], visibleModels[i]);
                }
            },
            editable: true,
            navigatable: true,
            dataSource: {
              change: function(e) {
                    console.log(e);
                    if (e.action == "itemchange" && e.field == 'Discontinued') {
                    var model = e.items[0];
    
                    if(model.get('Discontinued'))
                    {
                      var total =  model.get("UnitPrice") * model.get("UnitsInStock");
                      model.set("TotalInventory",total);
                    }
                    else
                    {
                      model.set("TotalInventory",0);
                    }
                  }
              },
                transport: {
                read: function(options) {
                    options.success(products); 
                }
              }
            },
            columns: [
              { 'field': 'Discontinued', 'title':'<center>Discontinued</center>', 'width': 95, 'template': kendo.template($('#checkboxTemplate').html()) },
              { 'field': 'ProductName', 'title':'<center>Product Name</center>', 'width': 90 },
              { 'field': 'UnitPrice', 'title':'<center>Unit Price</center>', 'width': 90 },
              { 'field': 'UnitsInStock', 'title':'<center>Units In Stock</center>', 'width': 90 },
              { 'field': 'TotalInventory', 'title':'<center>Total Inventory</center>', 'width': 90 }
            ]
          });
      </script>   
    

    如果您不设置该字段,则网格不会尝试将您的列转换为可编辑控件,它会以相同的方式做出反应并同时更改数据源中的模型。

    https://dojo.telerik.com/AYEsUSiz/6

    代码:

    <div id="grid"></div>
      <script type="text/x-kendo-template" id="checkboxTemplate">
          <input type="checkbox" data-bind="checked: Discontinued" class="chkbx" />
      </script>
      <script>
            $('#grid').kendoGrid({
            dataBound: function(e) {
                let visibleModels = e.sender.dataSource.view();
                var items = e.sender.items();
                for(var i = 0 ; i < items.length; i++) {
                    kendo.bind(items[i], visibleModels[i]);
                }
            },
            editable: true,
            navigatable: true,
            dataSource: {
              change: function(e) {
                    console.log(e);
                    if (e.action == "itemchange" && e.field == 'Discontinued') {
                    var model = e.items[0];
    
                    if(model.get('Discontinued'))
                    {
                      var total =  model.get("UnitPrice") * model.get("UnitsInStock");
                      model.set("TotalInventory",total);
                    }
                    else
                    {
                      model.set("TotalInventory",0);
                    }
                  }
              },
                transport: {
                read: function(options) {
                    options.success(products); 
                }
              }
            },
            columns: [
              { 'title':'<center>Discontinued</center>', 'width': 95, 'template': kendo.template($('#checkboxTemplate').html()) },
              { 'field': 'ProductName', 'title':'<center>Product Name</center>', 'width': 90 },
              { 'field': 'UnitPrice', 'title':'<center>Unit Price</center>', 'width': 90 },
              { 'field': 'UnitsInStock', 'title':'<center>Units In Stock</center>', 'width': 90 },
              { 'field': 'TotalInventory', 'title':'<center>Total Inventory</center>', 'width': 90 }
            ]
          });
      </script>
    

    【讨论】:

    • 非常感谢!这与我正在寻找的非常接近,非常感谢您抽出时间来帮助我。它仍然做的唯一奇怪的事情是标签行为。切换到复选框控件并按空格键以了解我的意思。空格键正确地检查了该框,正确地进行了数学运算,但是当您离开控件时,它又回到未选中状态。如果我找到答案,我会在这里发布,除非你打败了我。再次感谢。
    • @BoredBsee 我确实试图让它变得更好,遗憾的是网格的自然行为是仅在其聚焦时触发编辑,因此通过对其进行一些数据绑定,即使它在您的数据源中工作时你专注而不是刷新它只会带回某种失去的控制。我试图让它变得更好,但还没有找到方法。我有一个想法,该列不会绑定到一个字段,但该列可以工作,我会在晚餐后尝试:)
    • @BoredBsee 我在底部添加了一个修订版,它表明如果您不在列中设置字段属性,网格将不会尝试为该字段创建可编辑项,并且您不应该得到您的故障了。
    • 非常感谢!我从来没有想过要这样做。奇迹般有效。我希望我能给你更多的分数,你是救命稻草。
    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多