2010-06-22 1 views
0

http://wwwendt.de/tech/dynatree/index.htmlDynatree하는 AddChild - 내가 분명히하고 싶은 구성 요소의 저자

을위한 질문 다음 하는 AddChild가 호출 될 때 - 수행하는 전체 트리 취득 렌더링 - 다시하거나 수정 된 노드 (추가 된 노드와 노드 그 새로운 자녀를 낳았습니까?)

나는 정보의이 개 충돌 조각을 얻고있다 : Lazy Loading in dynatree 만 영향을받는 노드가 얻을 것이다 말한다 다시 렌더링

Dynatree slow when dynamically loaded with 100+ nodes 여기 그것이마다하는 AddChild이

을 사용 다시 렌더링 얻을 않는다는 것을 말한다

아마도, 나는 무엇인가 놓치고 있습니까?

어느 쪽입니까?

답변

1

Dynatree는 노드를 내부 구조에 저장합니다. '렌더링'은 에 DOM 요소 인 의 HTML 요소를 생성하거나 업데이트하는 프로세스로, 트리의 상태를 반영합니다. 예를 들어, 분기의 마지막 노드에 특별한 클래스 이름이 있으므로 노드를 추가하는 노드는 이전 '마지막 노드'에서이 클래스를 제거하고 을 추가해야합니다. 새 노드를 에 추가하십시오.

.addChild (data)를 호출 할 때마다 렌더링이 트리거됩니다. 하나의 호출로 100 개의 노드를 전달하면 렌더링은 한 번만 수행되며 이므로 노드는 단일 노드 으로 100 회 호출하는 것보다 항상 더 효과적입니다.

가 현재하는 AddChild이 패턴을 사용합니다 (0.5.4가 릴리스) :

var prevFlag = tree.enableUpdate(false); 
[modify the tree] 
tree.enableUpdate(prevFlag); 

enableUpdate을 (참) tree.redraw()를 호출, 그래서 전체 트리가 업데이트됩니다. 이것은 릴리스 1.0으로 변경되지만 결합하더라도 더 빨리 결합합니다. addChild 호출합니다.

이 노드 인 경우 은 DOM에이 작성된 경우입니다. 첫 번째로 노드 이 으로 표시 될 때까지 HTML 요소 생성 1.0부터 시작됩니다. 그래서 DOM을 부풀리지 않고 매우 많은 수의 노드를 효율적인 DYNATREE 데이터 구조 에로드 할 수 있습니다.

트리 전체를 사전로드하는 것이 더 편한 경우 또는 단일 분기가 서버, 네트워크 및 클라이언트에 종속적으로 지연됩니다. 따라서 항상 다른 시나리오를 벤치마킹해야합니다.

+0

정보를 제공해 주셔서 감사합니다. .addChild (nodesToAdd)가 호출되면 기존 노드도 다시 그려지는 것입니까? 나는 분명히 nodesToAdd가 렌더되지만, 기존 노드는 어떻게 렌더링되는지 이해합니다. 이렇게하면 전체 트리를 다시 그립니다. – sarsnake

+0

방금 ​​당신의 답을 읽고 그 답이 예입니다. 모든 노드가 바뀔 때마다 나무가 다시 그려지는 것처럼 보입니다. 그것은 마치 var prevFlag = tree처럼 보입니다.enableUpdate (false); 은 노드가 변경된 경우 전체 트리가 다시 그려지는 것을 의미하는 'true'를 반환합니다. 내 이해가 맞습니까? 시간 내 주셔서 다시 한번 감사드립니다. – sarsnake

+0

enableUpdate (..)는 이전 업데이트 모드를 반환합니다. 이 패턴을 사용하면 이전 상태 (재귀 호출 계층 구조에서도)를 복원 할 수 있습니다. 수정 사항을 추적하지 않기 때문에 enableUpdate (true)는 항상 전체 트리를 업데이트합니다. 새 노드를 만들고 기존 노드의 클래스 이름을 업데이트합니다. v1.0의 경우 mynode.addChild (childOrChildList)의 구현을 변경하여 mynode 분기 만 다시 그리도록 할 수 있습니다. – mar10

관련 문제