编程语言
首页 > 编程语言> > javascript – wirejs – 每个依赖组件的新组件实例

javascript – wirejs – 每个依赖组件的新组件实例

作者:互联网

第一:我是新的线程,它很可能我错过了文档上的东西

在常规组件声明中,如:

'Bnaya/App/TrackingService': {
    create: {
        module: 'Bnaya/App/TrackingService',
        args: []
    }
}

使用$ref依赖于该组件的所有组件将获得相同的实例,因此连线也将是一种单独机制(在大多数情况下这对我有好处)

在某些情况下,我希望每个依赖项都使用相同的组件配置获得自己的组件实例.

'Bnaya/App/TrackingService': {
    create: {
        module: 'Bnaya/App/TrackingService',
        args: [],
        notASingleton: true
    }
}

我知道如何使用多个组件名称或内联创建实例来获得类似的结果,但这是我想要避免的.

谢谢!

解决方法:

有两种方法可以在wire.js中创建多个组件实例.根据您的需求,您可以看到哪一个可能适合您.

首先,您可以使用create factory从原型中获取新实例.当你给create一个函数或构造函数模块时,它会调用它们.但是,如果您创建一个现有对象,它将使用Object.create来生成一个新实例,然后您可以像往常一样进一步配置(例如使用属性,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

然后,在我的/ 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导出一样.

这种方法有一些很好的好处,你可以在里面配置“私有”组件
my / trackingService.js也将根据需要创建,但只有trackingService可见.不利的一面是,将这样的原型组件分离成自己的线规有时需要做多少工作.

即将推出的wire.js版本将支持其他类型的组件范围,因此可以使某些情况更容易.

标签:javascript,inversion-of-control,ioc-container,wirejs
来源: https://codeday.me/bug/20190629/1323465.html