1

我对如何使用 RequireJs 实例化我的对象有点困惑。我正在使用将所有对象定义为类型函数的咖啡脚本类?(不确定正确的术语)

目前我正在为自己的对象使用依赖注入,这是一个示例 viewModel 和服务

我通过选项数组将我的服务注入构造函数中的视图模型

define 'myViewModel', [ 'jquery', 'sammy' ], ( $, sammy ) ->
  class myViewModel
    constructor: ( options ) ->
      self = @
      @service = options.service

      @router = sammy( -> 
        @get( '/SomeRoute#:id', self.onHashUpdated )
      )
      @router.run()

这里我将 alertId 注入到服务中

define 'myService', ['baseService'], ( baseService ) ->
  class myService extends baseService
    constructor: ( options ) ->
      @alertId = options.alertId
      super()    

这是我的高级页面对象。我进行视图模型实例化并将所有需要的依赖项注入到视图模型中。

require [ 'myViewModel', 'myService', 'domReady!' ], ( viewModel, service ) ->
  myViewModelInstance = new viewModel
    service: new service
      alertId: 'some-alert-id'

我只是不确定我是否应该这样做,或者我是否应该从服务定义中返回一个新服务,使其成为单例。

所有其他依赖项,如jquery, sammyknockout都像这样工作并返回工作对象,require而不是像我的对象那样需要实例化的类型。

是否有使用 requireJs 的公认模式?

我应该进行依赖注入还是服务定位?


这导致测试 javascript 并找到一个可以覆盖 requireJs 并返回模拟对象而不是真正的依赖项的库。

在茉莉花中,我可能会有这样的东西

describe '=== my view model ===', ->
  sut = null

  beforeEach ->
    require ['myViewModel', 'mockService'], ( viewModel, mockService ) ->
      sut = new viewModel
        service: new mockService

我尝试了testr但文档很糟糕,并且没有任何关于如何使用它的完整示例。

SquireJs看起来也有这种可能性?

4

1 回答 1

0

我已经完成了以下操作,让每个对象实例化它自己的依赖项

define 'myService', ['baseService', 'alert'], ( baseService, alert ) ->
  class myService extends baseService
    constructor: ( options ) ->
      super()
      @alertId = new alert

然后在我测试模块时使用 squire js 注入 sinon js 模拟。

于 2013-07-17T12:24:52.793 回答