Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript wirejs-每个依赖组件的新组件实例_Javascript_Inversion Of Control_Ioc Container_Wirejs - Fatal编程技术网

Javascript 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也将是一种单例机制(在大多数情况下这对我很好) 在某些情况下,我希望每个依赖项都使用相同的组件配置获得自己的组件实例

第一:我是新来的wirejs,很可能我在文档中遗漏了什么

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

'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
允许您从导线等级库导出一个或多个特定组件,这与CommonJS
exports
非常相似

这种方法有一些好处,因为您可以在内部配置“私有”组件
my/trackingService.js
也将根据需要创建它们,但只有
trackingService
将可见。不利的一面是,有时需要更多的工作来将这样的原型组件分离到它自己的wire spec中


即将发布的wire.js版本将支持其他类型的组件作用域,因此在某些情况下会更容易。

My classes系统在主干网中。有没有一种方法可以让你描述的第一种方法使用它?我想说服我的团队在一个新项目中使用wire,而另一种方法看起来更复杂,需要对当前的代码库进行更多的修改。啊,我就是无法在这里正确格式化我的评论);非常感谢。不幸的是,主干网的模型和集合在设计上不能很好地与Object.create配合使用。但是,您可以非常有效地使用第二种技术(导线工厂)。另一个wire.js用户创建了一个显示该项目的项目:具体请参见: