2014/09/23

AngularJS のコントラーロを CoffeeScript の class で書く

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 フレームワークのサーバ処理がごっそりクライアントサイドに移った感じ。

0 件のコメント: