2012-06-20 3 views
0

Я новичок в Flex (получил назначение для поддержки старого проекта на работе), и у меня возникают проблемы с правильной работой привязки данных. У меня есть popup form class, AddOffer.mxml, который использует модель AddOfferModel.as. На моей всплывающей форме, у меня есть следующий компонент:Связывание данных по нескольким объектам в Flex 3

<mx:FormItem label="{getResource('addOffer.form.OFFER_DATE')}:" 
     labelWidth="90"> 
     <views:OfferWindowDatesFragment 
      id="offerWindowField" 
      start="{model.offerStartDate}" 
      stop="{model.offerStopDate}" /> 
    </mx:FormItem> 

Мой файл AddForm.mxml также имеет некоторые встроенные ActionScript, где я определяю свою «модель» переменной:

[Bindable] 
    public var model:AddOfferModel; 

переменных модели я пытаюсь для привязки являются стандартными геттеры/сеттеры и выглядеть следующим образом внутри AddOfferModel.as:

[Bindable] 
    public function set offerStartDate(val:EditableInstant):void 
    { 
     _offerStartDate = val; 
    } 
    public function get offerStartDate():EditableInstant 
    { 
     return _offerStartDate; 
    } 
    private var _offerStartDate:EditableInstant; 


    [Bindable] 
    public function set offerStopDate(val:EditableInstant):void 
    { 
     _offerStopDate = val; 
    } 
    public function get offerStopDate():EditableInstant 
    { 
     return _offerStopDate; 
    } 
    private var _offerStopDate:EditableInstant; 

внутри класса компонента OfferWindowDatesFragment, запуска и остановки переменные выглядят следующим образом:

[Bindable] 
    public function set start(val:EditableInstant):void 
    { 
     _start = val; 
    } 
    public function get start():EditableInstant 
    { 
     return _start; 
    } 
    private var _start:EditableInstant; 


    [Bindable] 
    public function set stop(val:EditableInstant):void 
    { 
     _stop = val; 
    } 
    public function get stop():EditableInstant 
    { 
     return _stop; 
    } 
    private var _stop:EditableInstant; 

В принципе, я просто хочу, чтобы связать начальную и конечную переменные в моем классе OfferWindowDatesFragment к переменным offerStartDate и offerStopDate в файле AddOfferModel.as. Всякий раз, когда я получаю доступ к переменным start/stop в функциях внутри класса OfferWindowDatesFragment, они равны нулю.

У меня есть функция слушателя событий, который получает срабатывает в OfferWindowDatesFragment в любое время пользователь выбирает новую дату, это выглядит следующим образом:

private function changeOfferDate():void 
    { 
     start.currentValue = offerDateEditor.start; 
    stop.currentValue = offerDateEditor.stop; 
    } 

Каждый раз, когда я достигаю эту функцию, она бросает ошибку, потому что «старт 'и' stop 'равны нулю ... но должны быть уже инициализированы и связаны. Если я посмотрю на переменные в отладчике, я могу подтвердить, что значения в правой части выражения присваивания действительны, а не то, что вызывает ошибку.

Я не знаю, как работает инициализация в Flex, и я предположил, что, пока я создавал экземпляр компонента, как показано в первом фрагменте кода в верхней части моего сообщения, он инициализировал все переменные класса и установил привязки. Я что-то упускаю? Возможно, я неправильно инициализирую данные модели или класса для AddForm.mxml или AddFormModel.as, тем самым связывая нулевые ссылки на поля start/stop в классе OfferWindowDatesFragment?

Любая помощь была бы принята с благодарностью. Благодаря!

EDIT:

Я посмотрел на это все дальше и попытался с помощью Mate впрыснуть 'модель' переменную внутри AddOffer.mxml с действительным объектом AddOfferModel:

<Injectors target="{AddOffer}" debug="{debug}"> 
     <ObjectBuilder generator="{AddOfferModel}" constructorArguments="{scope.dispatcher}" cache="local"/> 
     <PropertyInjector targetKey="model" source="{lastReturn}" /> 
    </Injectors> 

я загружаю AddOffer. mxml в результате события нажатия кнопки в другой форме.

public function addOffer():void 
    { 
     var addOfferDialog:AddOffer = new AddOffer(); 

     addOfferDialog.addEventListener("addOffer", addOfferFromDialog); 

     modalUtil.popup(addOfferDialog); 
    } 

Это не похоже, назначая ничего к «модели» переменной в AddOffer.mxml: Функция, которая выскакивает это выглядит так. Загружает ли это просмотр/диалог таким образом, чтобы не запускать инъекцию из Mate случайно? (Я понимаю, что эта последняя часть может принадлежать на форумах Mate, но я надеюсь, что кто-то здесь может иметь некоторое представление обо всем этом).

ответ

1

В AddOffer.MXML, у вас есть этот код:

[Bindable]  
public var model:AddOfferModel; 

Есть ли что-то за пределами AddOffer.mxml, что установка этого к действительному AddOfferModel? Там должен быть. Характер того, как жизненный цикл компонента Flex означает, что вы можете ожидать, что вещи могут быть нулевыми по времени, как сборка «Просмотр». Поэтому вы должны создавать свои компоненты, чтобы иметь возможность «правильно себя» после получения плохих данных, если данные в итоге придут хорошо.

Связывание данных - один из способов сделать это, но он не может обрабатывать все в зависимости от того, что еще происходит.

Вы подтвердили, что полученное вами значение модели не является нулевым в момент, когда пользователь выбирает дату и что его свойства OfferStartDate и offerEndDate заполнены действительными EditableInstants? Если оба они верны, я бы начал искать фрагменты представлений, которые ожидают наличия материала в данный момент, а затем не будут восстановлены, если они будут предоставлены позже.

+0

Я пытаюсь использовать Мате, чтобы ввести переменную 'model' при загрузке AddOffer.mxml. Я добавил дополнение к моему сообщению выше. – konakevin

+0

Вы подтвердили, что ваш lastReturn содержит экземпляры EditableInstance и что они не являются нулевыми (например, используя Charles Web Proxy для просмотра трафика)? –

+0

Вот работающий проект Mate с включенным режимом просмотра, который вы можете использовать в качестве ссылки http://www.developria.com/2010/05/refactoring-with-mate.html –