2014-01-21 25 views
3

第一:我是新wirejs其極有可能我已經錯過了對文檔wirejs - 爲每個新組件實例依賴組件

在常規組件聲明的東西,如:

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

所有使用$ ref取決於該組件的組件將獲得相同的實例,因此wire也將是一種單身機制(對於大多數情況,這對我很有用)

在某些情況下,我想每個依賴者都會得到它自己的實例onent,使用相同的組件配置。

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

我知道如何使用多個組件名稱或內聯創建實例來獲得相似的結果,但這正是我試圖避免的。

謝謝!

回答

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版本將支持其他類型的組件作用域,因此會使一些情況更容易。

+0

我的班級系統主要是骨幹。 有沒有辦法讓你描述的第一個方法可以使用它? 我想說服我的團隊在一個新項目中使用wire,另一種方法看起來更復雜,需要對當前代碼庫進行更多更改。 ARR我只是不能格式化我的意見在這裏); 謝謝! – Bnaya

+1

不幸的是,Backbone的模型和集合的設計並不適合Object.create。但是,您可以非常有效地使用Backbone的第二種技術(電線工廠)。另一個wire.js用戶創建了一個顯示它的項目:https://github.com/pieterv/backbone-require-wire,具體請參見:https://github.com/pieterv/backbone-require-wire/blob/master /js/todos/src/context/main.js#L54-L58 –