在 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 任何东西,因此 logAfterCreatedEvent
和 logAfterReloadDataEvent
是 undefined
。
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);
};
}
这个显示捕获事件的 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 任何东西,因此 logAfterCreatedEvent
和 logAfterReloadDataEvent
是 undefined
。
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);
};
}