在 ngTable 中捕获事件

Capturing events in ngTable

这个显示捕获事件的 ngTable demo 使用 underscore.js (例如 _.partial ),我试图 运行 它没有这种依赖性。

在这个 plunker 中,我有一个简化版本(没有 underscore.js)可以工作(查看控制台日志),但我也遇到了一个 ngTable 错误 Cannot read property 'apply' of undefined

这段代码有什么问题?如何不包含 underscore.js

HTML

<div ng-controller="myCtl" ng-app="app">
   <table ng-table="tableParams" class="table table-bordered">
        <tbody>
            <tr ng-repeat="u in $data">
                <td title="'User ID'">{{ u.uid }}</td>
                <td title="'Name'">{{ u.nm }}</td>
                <td title="'Group'">{{ u.ugr }}</td>
            </tr>
        </tbody>
    </table>
</div>

Javascript

var app = angular.module('app', ['ngTable']);

app.controller('myCtl', function($scope, NgTableParams,ngTableEventsChannel) {

      $scope.data = [{
          uid: 'User 1',
          nm: 'Name 1',
          ugr: 'Group 1'
      }, {
          uid: 'User 2',
          nm: 'Name 2',
          ugr: 'Group 2'
      }]; 

      var tableEvents = [];

      function subscribeToTable(tableParams){
          var logAfterCreatedEvent = logEvent (tableEvents, "afterCreated");
          ngTableEventsChannel.onAfterCreated(logAfterCreatedEvent, $scope, $scope.tableParams);
          var logAfterReloadDataEvent = logEvent ( tableEvents, "afterReloadData");
          ngTableEventsChannel.onAfterReloadData(logAfterReloadDataEvent, $scope, $scope.tableParams);
      }

      function logEvent(list, name){
         console.log(">>>>>>> " + name);
      }

      $scope.$watch("tableParams", subscribeToTable);

      $scope.tableParams = new NgTableParams({
          count: 5
      }, {
          data: $scope.data
      });

});

嗯,是的,该代码无法运行。您通过给 ngTable 一个回调函数名称来定义两个回调,但不是给它函数的引用,而是给它 return 值:

var logAfterCreatedEvent = logEvent (tableEvents, "afterCreated");
var logAfterReloadDataEvent = logEvent ( tableEvents, "afterReloadData");

函数 logEvent 没有 return 任何东西,因此 logAfterCreatedEventlogAfterReloadDataEventundefined

ngTableEventsChannel.onAfterCreated (
     logAfterCreatedEvent, 
     $scope, 
     $scope.tableParams
);

ngTableEventsChannel.onAfterReloadData (
     logAfterReloadDataEvent, 
     $scope, 
     $scope.tableParams
);

因此,Angular 在尝试调用您的回调时变得平淡无奇。

一个解决方法是将 logEvent() 重写为 return 回调函数的函数:

  function logEvent(list, name){
     var that = this;
     that.list = list;
     that.name = name;
    return function() {
     console.log(">>>>>>> " + that.name);
    };
  }

Here's a fixed version on JSBin