/** * ngTable: Table + Angular JS * * @author Vitalii Savchuk * @url https://github.com/esvit/ng-table/ * @license New BSD License */ (function(){ 'use strict'; angular.module('ngTable') .factory('ngTableEventsChannel', ngTableEventsChannel); ngTableEventsChannel.$inject = ['$rootScope']; /** * @ngdoc service * @name ngTableEventsChannel * @description strongly typed pub/sub for `NgTableParams` * * Supported events: * * * afterCreated - raised when a new instance of `NgTableParams` has finished being constructed * * afterReloadData - raised when the `reload` event has finished loading new data * * datasetChanged - raised when `settings` receives a new data array * * pagesChanged - raised when a new pages array has been generated */ function ngTableEventsChannel($rootScope){ var events = {}; events = addChangeEvent('afterCreated', events); events = addChangeEvent('afterReloadData', events); events = addChangeEvent('datasetChanged', events); events = addChangeEvent('pagesChanged', events); return events; ////////// function addChangeEvent(eventName, target){ var fnName = eventName.charAt(0).toUpperCase() + eventName.substring(1); var event = {}; event['on' + fnName] = createEventSubscriptionFn(eventName); event['publish' + fnName] = createPublishEventFn(eventName); return angular.extend(target, event); } function createEventSubscriptionFn(eventName){ return function subscription(handler/*[, eventSelector or $scope][, eventSelector]*/){ var eventSelector = angular.identity; var scope = $rootScope; if (arguments.length === 2){ if (angular.isFunction(arguments[1].$new)) { scope = arguments[1]; } else { eventSelector = arguments[1] } } else if (arguments.length > 2){ scope = arguments[1]; eventSelector = arguments[2]; } // shorthand for subscriber to only receive events from a specific publisher instance if (angular.isObject(eventSelector)) { var requiredPublisher = eventSelector; eventSelector = function(publisher){ return publisher === requiredPublisher; } } return scope.$on('ngTable:' + eventName, function(event, params/*, ...args*/){ // don't send events published by the internal NgTableParams created by ngTableController if (params.isNullInstance) return; var eventArgs = rest(arguments, 2); var fnArgs = [params].concat(eventArgs); if (eventSelector.apply(this, fnArgs)){ handler.apply(this, fnArgs); } }); } } function createPublishEventFn(eventName){ return function publish(/*args*/){ var fnArgs = ['ngTable:' + eventName].concat(Array.prototype.slice.call(arguments)); $rootScope.$broadcast.apply($rootScope, fnArgs); } } function rest(array, n) { return Array.prototype.slice.call(array, n == null ? 1 : n); } } })();