Flex / mate: mate не кэширует экземпляр, созданный с помощью Object Builder - PullRequest
2 голосов
/ 16 августа 2010

Если вы однажды запустите ObjectBuilder, экземпляр объекта будет кэширован, и в следующий раз, когда вы используете PropertyInjector или что-то еще, экземпляр объекта будет использоваться вместо создания нового объекта. Или, по крайней мере, так должно быть:)

Но в приведенном ниже примере кажется, что mate пытается снова создать экземпляр объекта:

Произошла следующая ошибка:

! 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 более подробно: Я использую 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>

Flex: 4.0 мат: 0,8,9

Ответы [ 2 ]

0 голосов
/ 16 августа 2010

Кажется, что вы не можете иметь два ObjectBuilder в одной EventMap.Это вызовет эту проблему.Когда я удалил ObjectBuilder в Preinitialize-Event, все работает нормально.

Это странное поведение, потому что в других местах я писал его, как в этом случае, и никаких проблем не возникало.Так что я не знаю, ПОЧЕМУ это работает, но, похоже, это решило мою проблему.

0 голосов
/ 16 августа 2010

поместите debug="true" как в тег EventHandlers, так и в тег Injector, и посмотрите, какой из них раньше .. попробуйте создать комбинацию события CreationComplete, либо PreIntitialize.если я не ошибаюсь в Application CreationComplete раньше, чем Preinitialize (но я не совсем уверен, потому что это меня тоже смущает).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...