首先:我是新的wirejs,我很可能错过了文档上的内容
在常规组件声明中,例如:
'Bnaya/App/TrackingService': {
create: {
module: 'Bnaya/App/TrackingService',
args: []
}
}
使用$ ref依赖于该组件的所有组件将获得相同的实例,因此连线也将是一种单独机制(在大多数情况下这对我有好处)
在某些情况下,我希望每个依赖项都会使用相同的组件配置获得自己的组件实例。
'Bnaya/App/TrackingService': {
create: {
module: 'Bnaya/App/TrackingService',
args: [],
notASingleton: true
}
}
我知道如何使用多个组件名称或内联创建实例来获得类似的结果,但这是我想要避免的。
谢谢!
答案 0 :(得分:3)
有两种方法可以在wire.js中创建多个组件实例。根据您的需求,您可以看到哪一个可能适合您。
首先,您可以使用create
工厂从原型中获取新实例。当你给create
一个函数或构造函数模块时,它会调用它们。但是,如果您为create
提供现有对象,则会使用Object.create
来生成新实例,然后您可以照常进一步配置(例如使用properties
,init
,建议等)。请记住,它的工作方式与Object.create
完全相同,因此将共享原型属性。
其次,你可以使用wire
factory来达到你所追求的效果。您只需要将非单例包装在自己的线规范中。这是一个简单的例子:
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版本将支持其他类型的组件范围,因此可以使某些情况更容易。