Angular.js CoffeeScript Controller Base Class - Devign に書いてあるとおり。
inject や initialize のとこをちょこっと変えて、こんな感じになった。
AuthedCtrl を継承していれば $scope にログインユーザが自動的にセットされる。本番は mixin 自にやりたいけどそれはまた今度で。
class @BaseCtrl
@register: (name) ->
name ?= @name || @toString().match(/function\s*(.*?)\(/)?[1]
angular.module('ngappApp').controller name, @
@inject: (args...) ->
@$inject ?= ['$scope']
@$inject = @$inject.concat args
constructor: (@scope, args...) ->
for key, index in @constructor.$inject[1..]
@[key] = args[index]
for key, fn of @constructor.prototype
continue unless typeof fn is 'function'
continue if key in ['constructor', 'initialize'] or key[0] is '_'
@scope[key] = fn.bind?(@) || _.bind(fn, @)
@initialize()
initialize: ->
class @AuthedCtrl extends BaseCtrl
@inject 'AuthService'
initialize: =>
super()
@AuthService.user (user) =>
@currentUser = user
@scope.currentUser = user
class VacationsCtrl extends AuthedCtrl
@register()
@inject 'Vacation'
initialize: =>
super()
@scope.vacations = @Vacation.query()
@scope.vacation = new @Vacation
create: =>
console.debug(@scope.vacation)
@scope.vacation.$save (v) =>
console.debug(v)
@scope.vacations.push(v)
@scope.vacation = new @Vacation
いまさらながら AngularJS をさわってみたけど、 C と VB で書いてたむかしながらサーバクライアントアプリみたいで、ちょっと楽しい。
あるいは継続を使った web フレームワークのサーバ処理がごっそりクライアントサイドに移った感じ。