Сведения о вопросе

Oleksandrop

17:16, 16th August, 2020

Теги

flex   data-binding    

Можно ли добавить прослушиватель событий к действию привязки данных в Flex?

Просмотров: 448   Ответов: 8

У меня есть ComboBox, который я привязываю к стандартному HTTPService, я хотел бы добавить прослушиватель событий, чтобы я мог запустить некоторый код после заполнения ComboBox от поставщика данных.

Как я могу это сделать?



  Сведения об ответе

COOL

23:26, 7th August, 2020

Flex не имеет определенных событий привязки данных, как это делает say ASP .Net. Вы должны следить за свойством dataProvider, как говорит Джон в первом ответе,но не просто за свойством combobox или его dataProvider. Допустим у вас есть такая установка:

<!-- Assume you have extracted an XMLList out of the result 
and attached it to the collection -->
<mx:HttpService id="svc" result="col.source = event.result.Project"/>
<mx:XMLListCollection id="col"/>

<mx:ComboBox id="cbProject" dataProvider="{col}"/>

Теперь, если вы установите changewatcher, как это:

// Strategy 1
ChangeWatcher.watch(cbProject, "dataProvider", handler) ;

ваш обработчик не будет срабатывать, когда данные возвращаются. Почему? Потому что сам dataProvider не изменился - изменилась его базовая коллекция. Чтобы вызвать это, вы должны сделать это:

// Strategy 2
ChangeWatcher.watch(cbProject, ["dataProvider", "source"], handler) ;

Теперь, когда ваша коллекция обновилась, ваш обработчик будет активирован. Если вы хотите заставить его работать с помощью стратегии 1, Не устанавливайте свой dataProvider в MXML. Скорее, обработайте событие collectionChange вашего XMLListCollection и в AS перепишите dataProvider из ComboBox.

Являются ли они точно такими же, как событие с привязкой к базе данных? Нет, но я пользовался ими, и у меня никогда не было проблем. Если вы хотите быть абсолютно уверены, что ваши данные привязаны, просто поместите changeWatcher в свойство selectedItem вашего combobox и выполните обработку там. Просто будьте готовы к тому, что это событие будет запускаться несколько раз и обрабатывать его соответствующим образом.


  Сведения об ответе

DO__IT

09:04, 26th August, 2020

Вы можете использовать mx.binding.utils.ChangeWatcher, как описано здесь .


  Сведения об ответе

screen

14:22, 19th August, 2020

В вашем примере кода попробуйте запустить validateNow() в методе resultReturned . Это заставит поле со списком зафиксировать свои свойства. Дело в том, что даже если свойство установлено, новое значение не используется до тех пор, пока не будет запущен commitProperties , что он сделает самое раннее на следующем кадре, validateNow() заставляет его сделать это сразу.


  Сведения об ответе

P_S_S

10:09, 3rd August, 2020

Вы можете использовать BindingUtils , чтобы получать уведомления при изменении свойства dataProvider поля со списком:

BindingUtils.bindSetter(comboBoxDataProviderChanged, comboBox, "dataProvider");

BindingUtils живет в пакете mx.binding.utils .

У меня есть более подробное описание того, как работать с BindingUtils здесь: существует ли безболезненная программная привязка данных?


  Сведения об ответе

SEEYOU

15:30, 22nd August, 2020

Вы также можете прослушать ResultEvent.RESULT на HTTPService, который будет вызван немного раньше, чем поле со списком будет заполнено, я думаю, но это может быть достаточно хорошо.


  Сведения об ответе

repe

04:51, 17th August, 2020

Где вы добавляете прослушиватель по сравнению с загрузкой данных? Возможно ли, что данные загружаются и событие срабатывает, прежде чем вы добавите свой слушатель?


  Сведения об ответе

pumpa

10:31, 13th August, 2020

@Herms

Прослушиватель определенно добавляется перед вызовом веб-службы, вот пример того, как выглядит мой код (я упростил много вещей...):

У меня есть этот компонент flex:


public class FooComboBox extends ComboBox
{
    private var service:HTTPService = null;
    public function ProjectAutoComplete()
    {
        service = new HTTPService();
        service.url = Application.application.poxmlUrl;
        service.addEventListener(FaultEvent.FAULT,serviceFault);
        service.addEventListener(ResultEvent.RESULT,resultReturned);


        this.addEventListener(FlexEvent.DATA_CHANGE,dataChange);
    }
    public function init():void
    {
        var postdata:Object = {};
        postdata["key"] = "ProjectName";
        postdata["accountId"] = Application.application.accountId
        service.send(postdata);
    }
    private function resultReturned(event:ResultEvent):void
    {
        this.dataProvider = service.lastResult.Array.Element;
        // thought I could do it here...but no luck...
    }
    private function dataChange(e:FlexEvent):void
    {
        // combobox has been databound
        mx.controls.Alert.show("databound!");
    }
    ...
}

а потом в файле mxml у меня есть FooComboBox с идентификатором "foo" и я звоню:


foo.init();

Мне нужно выполнить какой-то код после того, как combobox полностью databound...any идеи?


  Сведения об ответе

baggs

01:36, 12th August, 2020

Может быть, событие не срабатывает при первом наборе поставщика данных? Попробуйте установить поставщик данных в пустой массив в конструкторе, чтобы он определенно изменялся , а не просто изначально назначался позже в вашем методе resultReturned(). Я понятия не имею, поможет ли это, но попробовать стоит.

Кроме того, вы устанавливаете для поставщика значение lastResult.Array.Element. Это выглядит немного подозрительно для меня, так как поставщик данных, вероятно, должен быть массивом. Конечно, я понятия не имею, как выглядят ваши данные, поэтому то, что вы имеете, вполне может быть правильным, но я заметил, что это может быть связано. Может быть, это должно быть просто lastResult.Array?


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться