我对如何使用 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
, sammy
,knockout
都像这样工作并返回工作对象,require
而不是像我的对象那样需要实例化的类型。
是否有使用 requireJs 的公认模式?
我应该进行依赖注入还是服务定位?
这导致测试 javascript 并找到一个可以覆盖 requireJs 并返回模拟对象而不是真正的依赖项的库。
在茉莉花中,我可能会有这样的东西
describe '=== my view model ===', ->
sut = null
beforeEach ->
require ['myViewModel', 'mockService'], ( viewModel, mockService ) ->
sut = new viewModel
service: new mockService
我尝试了testr但文档很糟糕,并且没有任何关于如何使用它的完整示例。
SquireJs看起来也有这种可能性?