Javascript wirejs-每个依赖组件的新组件实例
第一:我是新来的wirejs,很可能我在文档中遗漏了什么 在常规组件声明上,例如:Javascript wirejs-每个依赖组件的新组件实例,javascript,inversion-of-control,ioc-container,wirejs,Javascript,Inversion Of Control,Ioc Container,Wirejs,第一:我是新来的wirejs,很可能我在文档中遗漏了什么 在常规组件声明上,例如: 'Bnaya/App/TrackingService': { create: { module: 'Bnaya/App/TrackingService', args: [] } } 使用$ref依赖于该组件的所有组件都将获得相同的实例,因此wire也将是一种单例机制(在大多数情况下这对我很好) 在某些情况下,我希望每个依赖项都使用相同的组件配置获得自己的组件实例
'Bnaya/App/TrackingService': {
create: {
module: 'Bnaya/App/TrackingService',
args: []
}
}
使用$ref依赖于该组件的所有组件都将获得相同的实例,因此wire也将是一种单例机制(在大多数情况下这对我很好)
在某些情况下,我希望每个依赖项都使用相同的组件配置获得自己的组件实例
'Bnaya/App/TrackingService': {
create: {
module: 'Bnaya/App/TrackingService',
args: [],
notASingleton: true
}
}
我知道如何使用多个组件名称或内联创建实例来获得类似的结果,但这正是我试图避免的
谢谢 有几种方法可以在wire.js中创建多个组件实例。根据你的需要,你可以看到哪一个适合你 首先,您可以使用
create
工厂从原型中生成新实例。当您给create
一个函数或构造函数模块时,它将调用它们。但是,如果您给create
一个现有对象,它将使用object.create
创建一个新实例,然后您可以像往常一样进一步配置该实例(例如,使用properties
、init
、通知等)。请记住,它的工作原理与Object.create
完全相同,因此原型属性将被共享
第二,您可以使用来实现您想要的效果。您只需将非单例封装在其自己的wire spec中即可。下面是一个快速示例:
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
允许您从导线等级库导出一个或多个特定组件,这与CommonJSexports
非常相似
这种方法有一些好处,因为您可以在内部配置“私有”组件
my/trackingService.js
也将根据需要创建它们,但只有trackingService
将可见。不利的一面是,有时需要更多的工作来将这样的原型组件分离到它自己的wire spec中
即将发布的wire.js版本将支持其他类型的组件作用域,因此在某些情况下会更容易。My classes系统在主干网中。有没有一种方法可以让你描述的第一种方法使用它?我想说服我的团队在一个新项目中使用wire,而另一种方法看起来更复杂,需要对当前的代码库进行更多的修改。啊,我就是无法在这里正确格式化我的评论);非常感谢。不幸的是,主干网的模型和集合在设计上不能很好地与Object.create配合使用。但是,您可以非常有效地使用第二种技术(导线工厂)。另一个wire.js用户创建了一个显示该项目的项目:具体请参见: