2010-08-16 27 views
2

如果您運行ObjectBuilder,則實例化的對象將被緩存,並且下次使用PropertyInjector或其他方法時,將使用實例化對象而不是創建一個新的對象。或者至少,這應該是這樣的:)Flex/mate:mate不會緩存使用Object Builder創建的實例

但在它下面的例子看來,隊友試圖再次實例化對象:

出現以下錯誤:

! TerminalPresentationModel - constructor called # dispatcher = [object GlobalDispatcher] ! 
<Injectors (started) target="[class TerminalPresentationModel]" includeDerivatives="false" dispatcherType="inherit" scope="[object Scope]"> 
     <PropertyInjector sourceKey="currentDate" targetKey="date" source="[class DateManager]" sourceCache="inherit" softBinding="false"/> 

--------------------------------------------------------- 
- ERROR: Wrong number of arguments supplied when calling the constructor 
- TARGET: TerminalPresentationModel 
- TAG: PropertyInjector 
- METHOD: constructor 
- FILE: TerminalMainEventMap 
- NO ARGUMENTS SUPPLIED 
- STACK TRACE: ###SHORTENED### 
--------------------------------------------------------- 


--------------------------------------------------------- 
- ERROR: source is undefined in tag PropertyInjector 
- TARGET: TerminalPresentationModel 
- TAG: PropertyInjector 
- FILE: TerminalMainEventMap 
--------------------------------------------------------- 

- INFO: Data binding will not be able to detect assignments to date 
</Injectors (end) target=[class TerminalPresentationModel]> 
! DateManager - constructor called # dispatcher = [object GlobalDispatcher] ! 
<Injectors (started) target="[class TerminalContainer]" includeDerivatives="false" dispatcherType="inherit" scope="[object Scope]"> 
    <ObjectBuilder registerTarget="true" constructorArguments="[object GlobalDispatcher]" cache="inherit" generator="[class TerminalPresentationModel]"/> 
    <PropertyInjector targetKey="pm" source="[object TerminalPresentationModel]" sourceCache="inherit" softBinding="false"/> 
- INFO: Data binding will not be able to detect assignments to pm 
</Injectors (end) target=[class TerminalContainer]> 

任何提示什麼是錯的用我的代碼?

更新2010-08-16 正如ktutnik requestes,更多的細節: 我使用EventMap:

<?xml version="1.0" encoding="utf-8"?> 
<EventMap 
    > 

    <fx:Script> 
     <![CDATA[   
      // imports and namespaces shortened 

      [Bindable] 
      public var endpoint:String = ""; 
     ]]> 
    </fx:Script> 


    <fx:Declarations> 
     <Debugger level="{Debugger.ALL}" /> 

     <myService:Services id="services" endpoint="{endpoint}"/> 

     <maps:TimeEventMap endpoint="{endpoint}"/> 

     <EventHandlers type="{FlexEvent.PREINITIALIZE}"> 
      <ObjectBuilder 
       generator="{TerminalPresentationModel}" 
       constructorArguments="{scope.dispatcher}" /> 
      <ObjectBuilder 
       generator="{DateManager}" 
       constructorArguments="{scope.dispatcher}" /> 
      <ObjectBuilder 
       generator="{TerminalFaultHandler}" /> 
     </EventHandlers> 

     <EventHandlers type="{DataServiceEvent.GET_CURRENT_TERMINAL_STATUS}"> 
      <RemoteObjectInvoker instance="{services.TerminalService}" 
       method="getCurrentTerminalStatus" 
       arguments="{[event.locationId,event.actualPlan]}" 
       showBusyCursor="false"> 
       <resultHandlers> 
        <MethodInvoker generator="{TerminalPresentationModel}" 
            method="setCurrentTerminalStatus" 
            arguments="{resultObject}" /> 
        <MethodInvoker generator="{TerminalFaultHandler}" 
            method="removeError" /> 
       </resultHandlers> 
      </RemoteObjectInvoker> 
     </EventHandlers> 


     <Injectors target="{TerminalContainer}" 
        debug="true"> 
      <ObjectBuilder 
       generator="{TerminalPresentationModel}" 
       constructorArguments="{scope.dispatcher}" /> 
      <PropertyInjector 
       targetKey="pm" 
       source="{lastReturn}" /> 
     </Injectors> 

     <Injectors target="{TerminalPresentationModel}" 
        debug="true"> 
      <PropertyInjector targetKey="date" source="{DateManager}" sourceKey="currentDate" /> 
     </Injectors> 

     <Injectors target="{TerminalContent}"> 
      <PropertyInjector targetKey="faultHandler" 
       source="{TerminalFaultHandler}" /> 
     </Injectors> 

     <EventHandlers type="{UnhandledFaultEvent.FAULT}"> 
      <MethodInvoker generator="{TerminalFaultHandler}" method="handleFault" 
          arguments="{event.fault}" /> 
     </EventHandlers> 
    </fx:Declarations> 
</EventMap> 

軟硬度:4.0 隊友:0.8.9

+0

你的代碼似乎對我很好..很奇怪.. – ktutnik 2010-08-16 14:34:51

回答

0

看來你在一個EventMap中不能有兩個ObjectBuilder。這會導致這個問題。 當我在Preinitialize-Event中刪除了ObjectBuilder時,一切正常。

這是一個奇怪的行爲,因爲在其他地方,我寫這樣的情況下,沒有發生問題。 所以我不知道它爲什麼起作用,但它似乎解決了我的問題。

+1

是的!實際上,擁有更多的一個對象構建器並不是一個問題。如果您在PreIntialize EventHandler的子項objectbuilder上設置「cache =」global「',會發生什麼?無論如何,我投票你的問題,希望Nahuel看到這一點,併爲你提供一個方向。 – ktutnik 2010-08-16 14:41:51

+0

如果在ObjectBuilder上設置cache =「global」,似乎沒有其他行爲。 +1爲您的幫助。 – hering 2010-08-17 07:02:20

0

debug="true"兩在你的EventHandlers和Injector標籤中,看看哪一個更早...嘗試將CreationComplete事件與PreIntitialize進行組合。如果我沒有在Application CreationComplete中誤認爲是早於預初始化(但是我不太確定..因爲它也讓我困惑)。

+0

順序是:構造函數被調用(with correct dispatcher)=>注入日期被調用=>構建對象。 它是:preinitialize - > initialize - > creationComplete,所以將其更改爲creationComplete可能會導致更多問題。 – hering 2010-08-16 09:03:24

+0

Plase完成你的代碼,因爲很多問題都可能導致這個..例如:EventScoping(EventMap或LocalEventMap),我不知道它是否是DateManager正確實例化。 **編輯**如果您使用版本的MATE和Flex版本,則可以幫助識別問題。 – ktutnik 2010-08-16 09:46:04

+0

我已經在我的問題中添加了更多信息。 – hering 2010-08-16 11:01:32