CoffeeScript定义Angular服务的方式

时间:2013-08-12 10:53:01

标签: angularjs coffeescript

Coffee脚本为我们提供了创建和使用类的方法。我正在尝试使用这种方法并在单独的文件中定义类以将它们用作服务:

class @Account
  isLoaded: no
  blahblah: ->
      ....


app.service('Account', ['$cookieStore', '$http', Account])

应用程序中大多数实体的常见问题是一些CRUD操作。由于我使用服务(如果他们是单身人士和工厂,如果他们不是)来描述这些实体,我现在面临的问题是从$ resource扩展我的服务类。显然,我不能以标准的coffeescript方式使用它:

class @Account extends $resource

目前我找到的唯一解决方案是在模块配置中更改类原型:

app.service('Account', ['$cookieStore', '$http', Account]) 
app.run (Account, $resource) ->
  Account.prototype = new ($resource API_PATH + '/asdasdasd')

其中,引出了一个问题,我在此之后只能使用所有$ resource功能,而不是在services的类构造函数中。因此,我应该定义一些额外的setup方法并在此处手动调用它。

第二个问题是所有的注入器都在构造函数中传递,因此,所有需要使用该注入器的类方法都应该定义INSIDE构造函数

  constructor: ($cookieStore, $http) ->
    console.log 'constructed'
    @addresses = [
      new AccountAddress('billing')
      new AccountAddress('shipping')
    ]
    @fetch = ->
      console.log 'here I can use $cookieStore and $http'
  foo: ->
    console.log 'here I can`t use $cookieStore and $http'

这看起来不太好。

有没有办法解决这个问题?

这个主要想法取自this google groups thread

中的第一个答案

1 个答案:

答案 0 :(得分:0)

我对控制器使用了以下语法:

app = angular.module 'myapp', []

class MySimpleCtrl

  @$inject: ['$scope'] 
  constructor: (@scope) ->
    @scope.demo = 'demo value'
    @scope.clearText = @clearText

  clearText: =>
    @scope.demo = ""

app.controller 'MySimpleCtrl', MySimpleCtrl

angular.bootstrap document, ['myapp']

看看这个jsFiddle:      http://jsfiddle.net/jwcMA/