Pavel Bosin: pavel@bosin.net
Invoices
Orders
Tickets
angular.module('demoApp').controller('InvoiceCtrl',
['$scope', 'Invoices', function ($scope, Invoices) {
Invoices.getFilteredList().then(function (response) {
// set invoices in the table data source
});
}]);
Invoices Controller loads filtered list of invoices
Tickets Controller loads filtered list of tickets
Orders Controller loads filtered list of orders
... and each has some specific differences from others
{
getObject: function (id) {...},
getList: function () {...},
getFilteredList: function () {...},
getFilters: function () {...},
getFilter: function () {...},
getColumns: function () {...},
getPagination: function () {...}
}Create a function that returns a simple object with the common methods. Call this function while instantiating a service.
Extend the result with object.create().
Add more specific methods.
Wrap the result as Angular service using factory pattern.
angular.module('demoApp').factory('BaseService',
['Restangular', function (Restangular) {
var BaseService = {
init: function (config) {...}
getObject: function (id) {...},
getList: function () {...},
getFilteredList: function () {...},
// ... see the slide with common methods
};
return BaseService;
}]);
angular.module('demoApp').factory('Invoices',
['Restangular', 'BaseService', function (Restangular, BaseService) {
// specific config: column definitions, filters, api url, etc.
var config = {...},
BaseService.init(config);
var thisService = {
// parent methods
getObject: function (id) {
return BaseService.getObject(id);
},
getFilteredList: function () {
return BaseService.getFilteredList();
},
// additional invoice specific functions
getSubList: function () {...}
};
return thisService;
}]);
Tickets and Orders services are very similar.
Using composition here, we have to implement parent methods as call-through.
angular.module('demoApp').BaseService = function (Restangular) {
return {
// initialize this base service with data
init: function (config) {
//...
},
// get configuration data
getColumns: function () { return config.columns; },
getFilters: function () { return config.listFilters; },
// get single object by id; returns a promise
getObject: function (id) {
//...
},
// get collection of objects; returns a promise
getFilteredList: function (filter) {
//...
}
};
};
angular.module('demoApp').factory('Invoices',
['Restangular', function (Restangular) {
var config = {...}; // specific data
var baseService = angular.module('demoApp').BaseService(Restangular);
var thisService = Object.create(baseService);
thisService.init(config);
// additional invoice specific functions
thisService.getSubList = function () {...};
return thisService;
}]);These slides: bit.ly/1zKvecS