Flex: Actionscript & DataBinding с использованием XML-файла - PullRequest
0 голосов
/ 23 марта 2011

Я создал свой собственный компонент, который использует XML-файл lastResult для привязки к свойству dataProvider.

Привязка происходит в AS следующим образом: BindingUtils.bindProperty(this.myChildComponent1,"dataProvider",this,"dataProvider");

Вышеуказанное успешно связывает this.dataProvider с моими дочерними компонентами dataProvider. Возникает проблема, что у меня есть еще один компонент, который мне нужен для привязки значений дочернего XML-результата. Больше так вроде:
this.dataProvider.child('NextNode')

Но проблема в том, что когда createChildren() компонента вызывается, XML lastResult еще не заполняется, поскольку запрос является асинхронным HTTPRequest, следовательно, this.dataProvider равно null.

В конце концов, когда данные поступают, они корректно связываются внутри, но я не могу связать следующего дочернего элемента данных с другим компонентом (this.myChildComponent2), либо:
BindingUtils.bindProperty(this.myChildComponent2,"dataProvider",this,"dataProvider.child('NextNode'");: говорит, что нет такого ребенка.

или

BindingUtils.bindProperty(this.myChildComponent2,"dataProvider",this,this.dataProvider.child('NextNode'));: говорит, что this.dataProvider равно нулю / не определено.

Даже выдача: if(this.dataProvider == null) {this.invalidateProperties();} else //Bind Child не работает, поскольку commitProperties вызывают только один раз, несмотря на то, что я звоню invalidateProperties() после проверки внутри commitProperties().

Любая помощь приветствуется. Спасибо.

1 Ответ

0 голосов
/ 24 марта 2011

Я не проверял это и не пытался связываться с XML и XML потомками, но здесь идет.

Вы должны попытаться использовать цепочку свойств, чтобы выполнить эту привязку. Ваш код не выглядит так, как будто он должен работать вообще, поскольку BindingUtil использует строки в качестве описаний свойств, а не строку, представляющую функцию, которую вы хотите вызвать. Ваш код: .

BindingUtils.bindProperty(this.myChildComponent2,"dataProvider",this,"dataProvider.child('NextNode')");

Вместо этого должно быть: .

BindingUtils.bindProperty(this.myChildComponent2,"dataProvider",this,["dataProvider","NextNode"]);

Помимо того, что ваш код выглядит так, как будто он не должен работать, есть и другие причины сделать это таким образом.

  1. Дочерние элементы XML не будут отправлять события изменения свойств, поэтому, если дочерний узел изменился, он все равно не будет обновляться во втором компоненте.

  2. Использование цепочки свойств означает, что будут искать изменения в «dataProvider» И «NextNode», поэтому, если любой из них изменяет привязку, срабатывает.

  3. Использование цепочки означает, что вам не нужно беспокоиться о том, что XML не загружается при запуске. Если свойство в цепочке недоступно, для цели просто устанавливается значение null.

Таким образом, если вы используете этот метод, только изменения в «dataProvider» будут вызывать привязку (this.dataProver = что-то еще или подобное). Если вы хотите, чтобы привязка также инициировалась с помощью изменения 'NextNode', вам придется вручную отправить событие PropertyChange, чтобы указать, что произошло изменение: .

dataProvider.dispatchEvent(new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE,false,false,PropertyChangeEventKind.UPDATE,"NextNode",*oldValue*,*newValue*);

Где oldValue / newValue являются необязательными. Дайте мне знать, если это работает ... Я думаю, что это должно, но эй, кто знает.

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