以编程方式在Kendo网格AngularJS中选择一行

时间:2014-03-28 15:29:24

标签: angularjs kendo-grid

有人可以帮助我以角度编程方式选择一个剑道网格行。我可以按行号选择一行。我无法找到一种方法来根据列的内容选择一行。

HTML:

 <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>
    <div kendo-grid="myGrid" k-options="myOptions"  k-selectable="'row'" k-on-change="myGridChange()"></div> 
  </body>

JS:

var app = angular.module('plunker', ['kendo.directives']);

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';

  $scope.myOptions = {
    columns:[
      {
        field: 'ID'
      },
      {
        field: 'FirstName'
      },
      {
        field: 'LastName'
      },
      ],
      dataSource: [
            {ID:139, FirstName:'John', LastName:'Doe'},
            {ID:250, FirstName:'Jane', LastName:'Smith'},
            {ID:376, FirstName:'Henry', LastName:'Rocks'}
            ],
      dataBound:function(e) {
              var grid = e.sender;
              grid.select("tr:eq(2)");
              grid.select("tr[FirstName='Henry'])");  // This doesn't work
      }
  };

  $scope.myGridChange = function(){
     var selectedRows = $scope.myGrid.select();             // This doesn't work
     console.log($scope.myGrid.dataItem(selectedRows[0]));
  };


});

此外,当以编程方式选择行时,我的网格更改事件中出现错误。手动选择行时,它可以正常工作。

这是我的傻瓜 http://plnkr.co/edit/PpDuSR10xNOxOVirDpfN?p=preview

4 个答案:

答案 0 :(得分:3)

你应该将你的“tr”建立在id / uid上。如果你检查元素,它会告诉你在该表行中有什么属性。

                dataBound:function(e) { 
                  var grid = e.sender;
                  var data = grid._data; //this is your array of data. make sure you check what's in your object array. log it to see.

                  data.forEach(function(entry) { 
                     if($scope.name === entry.name){ 
                        grid.select('tr[data-uid="' + entry.uid + '"]');  
                     }  
                  })
                },

答案 1 :(得分:2)

将您的dataBound更改为此,此搜索整个行搜索该词:

  dataBound:function(e) {
        var searchTerm = "Henry";
        var grid = e.sender;  
        grid.select("tr:contains('" + searchTerm + "')");
  }

或者仅基于单个列进行搜索,请执行以下操作:

  dataBound:function(e) {
    var grid = e.sender;
    $.each(grid.tbody.find('tr'),function(){
      var model = grid.dataItem(this);
      if(model.FirstName=="Henry"){
        grid.select(this);
      }                          
    });
  }

至于您的控制台错误,请在索引页面的网格上添加id="grid",并将myGridChange替换为:

$scope.myGridChange = function(){
    var grid = $scope.myGrid;
    if(!grid)
      grid = $("#grid").data("kendoGrid");
    var selectedRows = grid.select(); 
    var data = grid.dataItem(selectedRows[0]);
    console.log("The name is " + data.FirstName + ", "+ data.FirstName + " " + data.LastName);
};

您收到控制台错误,因为网格未附加到数据绑定功能中的select命令上的$ scope,导致网格引用为null。我不太了解angular JS,但是我通过分配网格和ID然后从该ID选择器获取网格,在上面做了一个hack解决方案。

答案 2 :(得分:1)

同样的问题:调用 $ scope.myGrid.select(someRow)不起作用。代码不会抛出异常,但它只是忽略了调用。

为了使它工作,我把它放在一个setTimeout:

setTimeout(function () {
  $scope.grid.select(someRow);
});

它不优雅,但它没有太多的LoC。我希望Telerik将在未来的版本中解决这个问题。

答案 3 :(得分:0)

编程

使用您正在使用的Kendo版本,它可能 。使用最新版本,您可以这样做:

To&#34;改进myGridChange()&#34;:

1。变化

k-on-change="myGridChange()"

k-on-change="myGridChange( dataItem )"

2。变化

$scope.myGridChange = function(){
  // some code
}

$scope.myGridChange = function( dataItem ){
  // dataItem will contain the row that was selected
}

基本上,您应该将所选行保存在模型/控制器中的某个位置。

以编程方式选择行

$scope.myGrid.select(); // this will not work. 

这是将Kendo代码与AngularJs混合使用。有时我们必须这样做,但让我们尽可能地避免它。

快速回答是没有办法做到这一点。你要做的是:

  1. 将CSS样式添加到行中。
  2. 修改模型以记住以编程方式选择的行。
  3. 我的网页上的答案很长here。是的,我经历了同样的痛苦。