I’ve seen some examples of using AngularJS services online that follow the convention of FooService.someMethod()
or BarService.whateverElse()
. I was confused about how to use AngularJS without throwing all my useful object-oriented programming experience out the window. I’ve come up with a solution that I think I like.
Here’s the CoffeeScript class. It’s simple enough that I think it should be fairly self-explanatory. Don’t worry too much about the details of what it does. Just notice there’s a constructor and one instance method.
"use strict"
angular.module("myApp").service "Report", (Payment) ->
class Report
constructor: ->
@startDate = moment().subtract(14, "days").format("MM/DD/YYYY")
@endDate = moment().format("MM/DD/YYYY")
refresh: (options) ->
Payment.query
"between[startDate]": moment(options.startDate).format("YYYY-MM-DD")
"between[endDate]": moment(options.endDate).format("YYYY-MM-DD")
"repId": options.repId
"issueId": options.issueId
Here’s how I’m using my Report
class in a controller:
"use strict"
angular.module("myApp").controller "PaymentsCtrl", ($scope, Report) ->
report = new Report()
$scope.startDate = report.startDate
$scope.endDate = report.endDate
$scope.rep = {}
$scope.issue = {}
$scope.refreshReport = ->
report.refresh(
startDate: $scope.startDate
endDate: $scope.endDate
repId: $scope.rep.id
issueId: $scope.issue.id
).then (rows) -> $scope.rows = rows
$scope.refreshReport()
Notice how I’m not doing something like ReportService.refresh()
. To me, that wouldn’t make complete sense. It makes a lot more sense to me to instantiate a report and then say report.refresh()
.
By the way, I discovered this post after coming up with my idea. Ben’s way is almost identical to mine, although I think my way is ever so slightly cleaner. But the fact that someone else is doing roughly the same thing is probably evidence that this idea isn’t totally retarded.