我对如何用RequireJs实例化我的对象感到有点困惑。我正在使用coffeescript类,它将我的所有对象定义为类型函数? (不确定正确的术语)
目前我正在为我自己的对象使用依赖注入,这里是一个示例viewModel和service
我通过选项数组
将我的服务注入到构造函数的视图模型中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并返回模拟对象而不是真正的依赖项。
在Jasmine我可能有类似的东西
describe '=== my view model ===', ->
sut = null
beforeEach ->
require ['myViewModel', 'mockService'], ( viewModel, mockService ) ->
sut = new viewModel
service: new mockService
我尝试了testr,但文档很糟糕,并没有任何关于如何使用它的完整示例。
对于这种事情,SquireJs看起来也是可能的吗?
答案 0 :(得分:0)
我已经完成了以下操作,让每个对象实例化它自己的依赖项
define 'myService', ['baseService', 'alert'], ( baseService, alert ) ->
class myService extends baseService
constructor: ( options ) ->
super()
@alertId = new alert
然后在我测试模块时使用squire js注入sinon js模拟。