wirejs - новый экземпляр компонента для каждого зависимого компонента
Во-первых: я новый проводник, и вполне возможно, что я что-то пропустил в документах
В обычном объявлении компонента, например:
'Bnaya/App/TrackingService': {
create: {
module: 'Bnaya/App/TrackingService',
args: []
}
}
Все компоненты, которые будут зависеть от того компонента, использующего $ref, получат один и тот же экземпляр, поэтому провод будет также своего рода одноэлементным механизмом (что хорошо для меня в большинстве случаев)
В некоторых случаях я хочу, чтобы каждый зависимый получал свой экземпляр компонента, используя те же конфигурации компонентов.
'Bnaya/App/TrackingService': {
create: {
module: 'Bnaya/App/TrackingService',
args: [],
notASingleton: true
}
}
Я знаю, как получить похожий результат, используя несколько имен компонентов или встроенное создание экземпляров, но это то, чего я пытаюсь избежать.
Спасибо!
1 ответ
Есть несколько способов создать несколько экземпляров компонентов в wire.js. В зависимости от ваших потребностей вы можете увидеть, какой из них может работать для вас.
Во-первых, вы можете использовать create
Фабрика порождает новые экземпляры от прототипа. Когда вы даете create
модуль функции или конструктора, он будет вызывать их. Однако, если вы дадите create
существующий объект, он будет использовать Object.create
создать новый экземпляр, который затем можно настроить как обычно (например, используя properties
, init
, советы и т. д.). Просто имейте в виду, что это работает так же, как Object.create
поэтому свойства прототипа будут общими.
Во-вторых, вы можете использовать wire
Завод для достижения желаемого эффекта. Вам просто нужно обернуть non-singleton в его собственную спецификацию провода. Вот быстрый пример:
thingThatNeedsATrackingService: {
create: 'my/ThingThatNeedsATrackingService',
properties: {
foo: { wire: 'my/trackingServiceSpec' }
}
},
otherThingThatNeedsATrackingService: {
create: 'my/OtherThingThatNeedsATrackingService',
properties: {
foo: { wire: 'my/trackingServiceSpec' }
}
},
//... more components
А потом, в my/trackingService.js
:
// Export the trackingService instance
$exports: { $ref: 'trackingService' },
trackingService: {
create: {
module: 'Bnaya/App/TrackingService',
args: []
}
},
//... more components if you need
Это введет новый экземпляр Bnaya/App/TrackingService
в каждую из двух вещей, которые нуждаются в одной. $exports
позволяет экспортировать определенный компонент или компоненты из спецификации провода, так же, как CommonJS exports
,
Этот подход имеет несколько приятных преимуществ в том, что вы можете настроить "частные" компоненты внутриmy/trackingService.js
и они также будут созданы по мере необходимости, но только trackingService
будет видно С другой стороны, иногда немного сложнее разделить подобный прототип компонента в его собственной спецификации проводов.
Следующая версия wire.js будет поддерживать другие типы областей действия компонентов, что упростит некоторые случаи.