Дьянмическое обновление Легенды - ActionScript 3 - PullRequest
0 голосов
/ 26 августа 2009

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

Пожалуйста, прочитайте следующие шаги, чтобы понять проблему.

  1. Создан линейный график с двумя рядами данных.
  2. Создана легенда.
  3. Добавленная диаграмма и легенда к контейнеру.

  4. Есть кнопка обновления. Нажал на кнопку.

  5. Теперь линейный график был обновлен тремя сериями данных.
  6. Когда я пытался обновить легенду, она все еще указывала на начальные значения с двумя метками вместо трех.

  7. Код, который я использовал для достижения (6)

опция (1)

this ["containerId"]. GetChildByName ("legendName"). DataProvider = LineChart (this ["containerId"]. GetChildByName ("chartName"));

опция (2)

this ["containerId"]. GetChildByName ("legendName"). DataProvider = this ["containerId"]. GetChildByName ("chartName") как LineChart;

Есть комментарии?

Спасибо Jay

Ответы [ 2 ]

0 голосов
/ 26 августа 2009

Около 1 года назад я проделал тяжелую работу с диаграммами Flex, и они могут быть постоянным источником разочарования. Дело в том, что они очень умные внутри, что приводит к очень трудным рассуждениям о поведении.

Одна вещь, которую я заметил, заключалась в том, что иногда, когда вы меняете данные, на самом деле может потребоваться несколько кадров, чтобы они проскользнули по иерархии. Это означает, что даже если вы обновите dataProvider для легенды в том же фрейме, что и при обновлении информации о серии, вы можете не связываться с правильной версией экземпляра, поскольку она изменится через несколько кадров. (т.е. изменение на Series является асинхронным, а изменение на dataProvider является синхронным).

Один быстрый тест, чтобы увидеть, если это ваша проблема, это просто установить таймер взлома. Установите его на 100 мс или около того, а затем установите dataProvider позже - надеюсь, когда изменения в Series дойдут до необходимого свойства. Другая идея состоит в том, чтобы использовать вторую кнопку, и, как только вы визуально увидите новый Series, используйте эту кнопку, чтобы вызвать назначение легенд dataProvider. Это не готовое к производству решение, но оно по крайней мере определит природу проблемы.

Если это ваша проблема (в которой я подозреваю, но не уверен), тогда начинайте искать события, которые происходят от всех компонентов диаграммы. Событие, которое сигнализирует о том, что новый Series был нарисован, может происходить из в любом месте , но вы в конце концов найдете его. Удачи.


Также разница между:

var foo:Bar = Bar(obj); // if !(obj is Bar) throw Error

и

var foo:Bar = obj as Bar; // if !(obj is Bar) return null

- это первое, лучше всего, если вы уверены, что obj приведёт к Bar и выдаст исключение, если это не так (на самом деле это будет ошибкой, если он не приведен к Bar). Второй (as) предназначен для случая, когда есть разумный шанс, что obj не будет Bar, и он не выдаст ошибку, а вместо этого вернет null.

Из-за этого поведения Adobe рекомендует использовать первую форму, когда это возможно.

0 голосов
/ 26 августа 2009

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

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


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

class Data {
    [Bindable(event="legendChanged")]
    public function get legend():LegendType {/*implementation*/}
    [Bindable(event="chartChanged")]
    public function get chart():ChartType {/*implementation*/}
    public function choseGraph(index:uint):void {
         //update state so the getters for chart and legend will return the right values
         this.dispatchEvent(new Event("legendChanged"));
         this.dispatchEvent(new Event("chartChanged"));
    }    
}

, а затем привяжите свой взгляд к нему.

...