Я немного смущен тем, как я должен создавать экземпляры своих объектов с помощью RequireJs. Я использую классы coffeescript, которые определяют все мои объекты как типизированные функции? (не уверен в правильной терминологии)
На данный момент я использую внедрение зависимостей для своих собственных объектов, вот пример 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 тоже подходит для такого рода вещей?