Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Можно ли добавить прослушиватель событий к действию привязки данных в Flex?
У меня есть ComboBox, который я привязываю к стандартному HTTPService, я хотел бы добавить прослушиватель событий, чтобы я мог запустить некоторый код после заполнения ComboBox от поставщика данных.
Как я могу это сделать?
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 и выполните обработку там. Просто будьте готовы к тому, что это событие будет запускаться несколько раз и обрабатывать его соответствующим образом.
В вашем примере кода попробуйте запустить validateNow() в методе resultReturned . Это заставит поле со списком зафиксировать свои свойства. Дело в том, что даже если свойство установлено, новое значение не используется до тех пор, пока не будет запущен commitProperties , что он сделает самое раннее на следующем кадре, validateNow() заставляет его сделать это сразу.
Вы можете использовать BindingUtils , чтобы получать уведомления при изменении свойства dataProvider поля со списком:
BindingUtils.bindSetter(comboBoxDataProviderChanged, comboBox, "dataProvider");
BindingUtils живет в пакете mx.binding.utils .
У меня есть более подробное описание того, как работать с BindingUtils здесь: существует ли безболезненная программная привязка данных?
@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 идеи?
Может быть, событие не срабатывает при первом наборе поставщика данных? Попробуйте установить поставщик данных в пустой массив в конструкторе, чтобы он определенно изменялся , а не просто изначально назначался позже в вашем методе resultReturned(). Я понятия не имею, поможет ли это, но попробовать стоит.
Кроме того, вы устанавливаете для поставщика значение lastResult.Array.Element. Это выглядит немного подозрительно для меня, так как поставщик данных, вероятно, должен быть массивом. Конечно, я понятия не имею, как выглядят ваши данные, поэтому то, что вы имеете, вполне может быть правильным, но я заметил, что это может быть связано. Может быть, это должно быть просто lastResult.Array?