coffeescript

时间:2015-07-30 21:31:11

标签: angularjs coffeescript

使用咖啡脚本类创建角度控制器的最佳做法是什么?我已经谷歌搜索了一段时间,但到目前为止还没有找到一个非常好的解决方案。

根据this article作者提出以下方法:

angular.module('myApp').controller 'SomeCtrl',
  class SomeCtrl
    someModels: -> ...

但是,如何对这种控制器进行任何注射并不清楚。由于咖啡会自动将所有方法移动到构造函数的原型,我将无法在这些方法中访问注入的服务。

到目前为止,解决这个问题的唯一方法是:

angular.module('myApp').controller 'SomeCtrl',
  class SomeCtrl
    @$inject: ['SomeService']
    constructor: (someService) -> 
      @load = ->
        # access to someService

显然这很难看,更不用说内存效率低了。

所以问题是,使用Coffee好吃的东西定义角度控制器的最佳方法是什么?

编辑:

显式使用进样器还有另一种选择:

app = angular.module('myApp')
injector = angular.injector([app.name])

injector.invoke ['SomeService', (SomeService) -> 
  app.controller 'SomeCtrl',
    class SomeCtrl
      foo: 'bar'
      func: ->
        # Prototype function with access to SomeService without exposing it in API.
]

然而,这会使代码顺序依赖,并且像地狱一样丑陋。

我理想的是将某个控制器定义为工厂的某种方式 - 而不是传递构造函数我希望传递一个返回构造函数的函数。这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

首先定义类,在构造函数中添加所需的服务......

class SomeCtrl
  constructor: (someService)-> alert someService 9

接下来,将控制器附加到应用程序...

angular.module('myApp').controller 'SomeCtrl', SomeCtrl

jsfiddle

上的示例
<div ng-app="myApp">
  <div ng-controller="SomeCtrl">
  </div>
</div>

......和......

angular.module 'myApp', []
angular.module('myApp').factory 'someService', ->
  (x)-> x * x;

class SomeCtrl
  constructor: (someService)-> alert someService 9
  someModels: ->

angular.module('myApp').controller 'SomeCtrl', SomeCtrl