Kendo 网格:在 Angular 中获取小部件实例

Kendo Grid: Getting widget instance in Angular

我试图在我的 Angular 控制器中获取 Kendo 网格的一个实例,因此我可以尝试连接一些事件(和调用方法)我知道这可能不是最佳实践(并且可能应该使用自定义指令),但根据 documentation,我们应该能够使用...

<div ng-app="app" ng-controller="MyCtrl">
<input kendo-datepicker="datePicker" k-on-change="onChange()">
</div>
<script>
 angular.module("app", [ "kendo.directives" ]).controller("MyCtrl",
   function($scope) {
 $scope.onChange = function() {
 alert($scope.datePicker.value());
};

});

所以,我试图对网格做同样的事情。我有以下标记...

<div ng-controller="Grid">
  <div kendo-grid='grid' k-options="vm.gridOptions"></div>  
</div>

然后在controller的js文件中..

  angular
    .module("mygrid")
    .controller("Grid", ['$scope', Grid]);

    function Grid($scope) {             
      var gridInstance = $scope.grid;
      ...

可见here

但是,gridInstance 总是未定义的。有谁知道我是否应该能够用网格做到这一点,如果是这样为什么上面总是 returns 未定义?

在此先感谢您的帮助

彼得

两期:

  1. 如果您使用 "controller as" 语法,您需要在要访问的内容前添加前缀(在您的情况下,您需要 kendo-grid="vm.grid" 而不是 kendo-grid="grid"
  2. 当你的控制器被实例化时,Kendo UI 小部件还不存在(类似的问题 ),所以你需要使用全局 Kendo UI 事件

所以你的 Html 变成:

<div data-ng-app="app">
    <div data-ng-controller="Grid as vm">
        <div kendo-grid="vm.grid" k-options="vm.options"></div>
        <div>{{vm.msg}}</div>
    </div>
</div>

您的应用:

(function () {
    angular.module("app", ["kendo.directives"])
        .controller("Grid", ["$scope", Grid]);

    function Grid($scope) {
        var vm = this;

        var gridData = [{
            col1: 'data1',
            col2: 'data2'
        }, {
            col1: 'data1',
            col2: 'data2'
        }];

        vm.options = {
            dataSource: gridData,
            editable: true
        };

        $scope.$on("kendoRendered", function (event) {
            var gridInstance = vm.grid;
            console.log(vm);
            vm.msg = gridInstance === undefined ? "undefined" : "defined";
        });
    }
})();

(updated demo)