4

第一:我是新的wirejs,很可能我错过了文档上的一些东西

在常规组件声明中,例如:

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

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

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

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

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

谢谢!

4

1 回答 1

3

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

首先,您可以使用create工厂从原型中获取新实例。当你给create一个函数或构造函数模块时,它会调用它们。但是,如果您提供create一个现有对象,它将用来Object.create生成一个新实例,然后您可以像往常一样对其进行进一步配置(例如,使用propertiesinit、通知等)。请记住,它的工作原理与 完全一样Object.create,因此原型属性将被共享。

其次,您可以使用wire工厂来实现您想要的效果。您只需要将非单件包装在其自己的电线规格中。这是一个简单的例子:

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 版本将支持其他类型的组件范围,因此会使某些情况更容易。

于 2014-01-21T18:59:11.817 回答