2009-08-25 4 views
0

액션 스크립트를 사용하여 만든 범례를 업데이트하는 데 문제가 있습니다.범례 - 액션 스크립트 3을 동적으로 업데이트

문제를 이해하려면 다음 단계를 읽으십시오.

  1. 두 개의 데이터 계열이있는 선형 차트를 만들었습니다.
  2. 범례 작성.
  3. 컨테이너에 추가 된 차트 및 범례.

  4. 업데이트 버튼이 있습니다. 버튼을 클릭합니다.

  5. 이제 꺾은 선형 차트는 세 가지 데이터 계열로 업데이트되었습니다.
  6. 범례를 업데이트하려고 시도했지만 여전히 3 대신 두 개의 레이블이있는 초기 값을 가리키고있었습니다.

  7. I (6)

옵션 (1)

이 [ "containerId"]. 사용해, getChildByName ("legendName").의 dataProvider = 선 차트 (이 [ "를 달성하기 위해 사용되는 코드 containerId "]. getChildByName ("chartName "));

옵션 (2)

이 [ "containerId"] 사용해, getChildByName ("legendName")의 dataProvider = 선 차트 등이 [ "containerId"] 사용해, getChildByName ("chartName")...;

의견이 있으십니까?

감사 제이

+0

확인. 차트의 계열 속성을 업데이트하는 코드가 누락되어 문제가 발생했습니다. chartInst.series = newSeries; 차트의 데이터 제공자가 업데이트 될 때마다 데이터 시리즈가 차트 구성 요소에서 자동으로 업데이트된다는 사실을 알았지 만 차트 범례가 업데이트를 이해할 수있는 일련의 새로운 세트를 만들어야하는 것처럼 보입니다. 범례의 dataProvider를 설정하기 전에 새 계열을 만들고이를 차트의 계열 속성으로 설정하십시오. 감사 – Jay

+0

대답은 내가 '때문에 하나의 페이지에서 약 50 ~ 60 차트를 처리 할 수 ​​있고 동적으로 생성해야 ... greetz – back2dos

답변

0

이 플렉스 큰 문제이다 : 매우 어려운 ... 문제는 아마 ...

멀리 이동해야 더 나은 ... AS3와 함께 사용할 MXML로 가서 바인딩을 만들 한 아이가 다른 DataProvider에,하지만 어쩌면 앱 레이아웃이 명확이 ... 일반적으로, dataProviders에서는이 응용 프로그램의 데이터 모델에서 온 것을 만드는 이유는 내가 완전히 이해하지

일이 ...,

입니다

편집 : 내가 생각 는, 바인딩은 다음과 같이 클래스를 만들어야합니다 ... 가장 좋은 방법은 다음과 같습니다

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")); 
    }  
} 

하고 그것에보기를 결합한다.

+0

안녕, 바인드 가능한 dataProviders에서는 많은 여기에 도움이되지 않습니다 업데이트. 다음 가있을 때마다 나는 을 유지하는 구조입니다 일부 입력 변경, 나는 관련 차트를 검색하고 데이터 시리즈 및 범례를 업데이 트합니다. 희망, 나는 당신에게 명확한 설명을했습니다. -Jay – Jay

0

약 1 년 전에 나는 플렉스 차트로 무거운 짐을졌으며 좌절의 지속적인 원인이 될 수 있습니다. 사실 그들은 내부에서 매우 영리하여 행동에 대해 추론하기가 매우 어렵습니다.

내가 알아챈 한 가지는 데이터를 변경할 때 가끔 계층 구조를 통해 약간의 프레임이 걸릴 수 있다는 것입니다. 이는 일련의 정보를 업데이트 할 때 동일한 프레임의 범례에있는 dataProvider을 업데이트하더라도 몇 프레임에서 바뀔 것이므로 정확한 버전의 인스턴스에 바인딩하지 않을 수 있습니다. (즉, Series으로의 변경은 비동기이며 dataProvider으로의 변경은 동기식입니다).

이 문제가 발생했는지 확인하는 간단한 테스트는 해킹 타이머를 설치하는 것입니다. 100ms 정도 설정 한 다음 나중에 dataProvider을 설정하십시오. Series에 대한 변경 사항이 필요한 속성에 적용되었을 때 잘하면이 값을 설정하십시오. 또 다른 아이디어는 두 번째 버튼을 사용하고 시각적으로 새로운 Series이 해당 버튼을 사용하여 범례 dataProvider의 할당을 트리거하는 것을 보는 것입니다. 이는 생산 준비가 된 솔루션이 아니지만 적어도 문제의 본질을 결정합니다.

(내가 의심 스럽지만 확실하지 않은) 문제라면 모든 차트 구성 요소의 이벤트를 찾으십시오. 새 Series 신호가 그려지는 이벤트는 어디에서나에 올 수 있지만 결국 찾을 수 있습니다. 행운을 빕니다. 또한


, 차이 사이 : 당신이 objBar 캐스팅됩니다 확신하고 예외의 경우가 발생합니다 경우

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

이 처음이다

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

가 최고입니다 실제로는 Bar으로 전송하지 않으면 오류가 발생합니다. 두 번째 ( as)는 적절한 기회가있을 때를위한 것이며 objBar이 아니며 오류를 발생시키지 않고 대신 null을 반환합니다.

이 동작으로 인해 가능할 때마다 첫 번째 양식을 사용하는 것이 좋습니다.

+0

시도 할 때 행운이 없음 a) 범례의 데이터 공급자를 설정하는 setTimeout 함수 호출. b) Legend의 인스턴스에 데이터 공급자를 할당하는 역할을 담당하는 eventHandler가 할당 된 새 단추를 추가합니다. 위의 두 경우 모두 dataProvider (chartInstance)가 업데이트 된 인스턴스 대신 초기 값을 가리키는 것으로 나타났습니다. 이 문제를 해결하면 업데이트됩니다. 감사합니다. Jay – Jay

관련 문제