Динамическое обновление Legends — ActionScript 3

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

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

  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") as LineChart;

Любые комментарии?

Спасибо Джей


person Jay    schedule 25.08.2009    source источник
comment
ХОРОШО. Проблема была из-за отсутствия кода для обновления свойства серии диаграммы !!! chartInst.series = новая серия; Каждый раз, когда обновляется поставщик данных диаграммы, хотя я заметил, что ряды данных автоматически обновляются в компоненте диаграммы, похоже, что нам нужно создать новый набор рядов, чтобы легенда диаграммы понимала обновление. Поэтому перед настройкой поставщика данных Legend создайте новую серию и установите ее в свойство серии Chart. Спасибо   -  person Jay    schedule 27.08.2009


Ответы (2)


Около года назад я проделал тяжелую работу с диаграммами 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 рекомендует по возможности использовать первую форму.

person James Fassett    schedule 26.08.2009
comment
Не повезло в попытке a) вызов функции setTimeout для установки поставщика данных Legend. б) добавление новой кнопки, назначенной обработчику событий, который заботится о назначении поставщика данных экземпляру легенды. В обоих приведенных выше случаях я заметил, что dataProvider (chartInstance) указывает на исходное значение вместо обновленного экземпляра. Сообщу вам, как только решу эту проблему. Спасибо Джей - person Jay; 26.08.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"));
    }    
}

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

person back2dos    schedule 26.08.2009
comment
Привет. Привязываемые поставщики данных здесь мало помогут, так как мне приходится обрабатывать около 50-60 диаграмм на одной странице и создавать их динамически. Ниже приведена структура, которую я поддерживаю: ‹контейнер› ‹диаграмма1›‹/диаграмма1› ‹легенда1›‹/легенда1› ‹диаграмма2›‹/диаграмма2› ‹легенда2›‹/легенда2› ‹диаграммаN›‹/диаграммаN› ‹легендаN›‹/легендаN › ‹/container› Всякий раз, когда во входных данных происходят какие-либо изменения, я извлекаю соответствующую диаграмму и обновляю ряды данных и условные обозначения. Надежда, я дал вам ясное объяснение. -Джей - person Jay; 26.08.2009