2009-08-17 3 views
8

내 JS 코드에서 dijit.layout.ContentPane, dijit.layout.StackContainerdijit.layout.BorderContainer의 인스턴스를 만듭니다.언제 프로그래밍 방식으로 인스턴스화 된 위젯의 startup() 메소드를 호출해야합니까?

프로그래밍 방식으로 만들어진 인스턴스의 startup() 메서드를 호출해야 할 것 같습니다. 그러나 모든 위젯에 대해 호출해야하는지 확신 할 수 없습니다. 예를 들어 'new my.foo.widget()'을 실행하면 startup()이 자동으로 실행됩니다.

startup() 방법을 언제 전화 할 수 있는지 이해해 주셔서 감사합니다!

답변

15

startup()은 _Widget에 정의되어 있으며 단순히 "라이프 사이클의 일부"입니다. 이는 위젯 라이프 사이클의 마지막 단계이며 모든 위젯에서 필수는 아닙니다. 절대적으로 필요한 가장 일반적인 경우는 프로그래밍 방식으로 레이아웃 위젯을 만들 때입니다. 아이들이 크기 조정이 필요할 때 중복 계산을 방지하는 방법으로 사용됩니다. 예를 들어, BorderContainer.

var bc = new dijit.layout.BorderContainer({ 
    style:"height:200px; width:200px" 
}); 

// can call bc.startup() now, and the BorderContainer will resize 
// all children each time a new child is added. Or, we can add all 
// our children now, then trigger startup() and do it all at once. 

var top = new dijit.layout.ContentPane({ 
    region:"top", style:"height:100px" 
}).placeAt(bc); 
var mid = new dijit.layout.ContentPane({ region:"center" }).placeAt(bc); 

// now BC will do the calculations, rather than in between each 
// the above addChild/placeAt calls. 
bc.startup(); 

parseOnLoad : true 또는 수동 실행의 경우 파서에 의해 시작 프로그램이 자동으로 호출됩니다. 파서는 발견 된 모든 자식 위젯이 적절하게 인스턴스화 될 때까지 startup()을 호출하는 것을 지연합니다.

dijit.Dialog는 이상한 경우입니다. 이 위젯에서도 startup()을 호출해야합니다.

var dialog = new dijit.Dialog({ title:"Hmm", href:"foo.html" }); 
dialog.startup(); 
dialog.show(); 

대부분의 위젯이라고 시작을 필요로하지 않지만, _Widget에서 상속 뭔가 시작 멤버를 오버라이드 (override)하지 않는 경우, 호출은 무 조작 설정이 = 사실 this._started 본질적; 자신 만의 startup() 함수를 만들면 this.inherited (arguments)를 호출하거나 단순히 _started 트리거를 수동으로 설정해야합니다.

Dojo 1.4에서, 여기의 라이프 사이클이 약간 조정되었습니다.이전에는 widgetsInTemplate : true가있는 위젯이 부모 위의 startup() 전에 자식 위젯에서 startup()을 호출했습니다. 1.4에서는 부모 시작() 후에 자식 시작()이 호출됩니다. 이 동작은 widgetsInTemplate이있는 여러 중첩 된 위젯에 대해 재귀 적입니다. true가 인스턴스화됩니다.

.startup()을 호출하는 것은 항상 안전하지만, 단순한 엔드 포인트 위젯 또는 사용자 정의 _Widget 코드이기 때문에 "알았다"는 경우에는 호출을 생략 할 수 있습니다.

+1

그냥 행동 정보 reg dijit.Dialog가 약간 변경되었습니다. 이제 show가 자동으로 함수 내부에서 시작을 호출합니다. – Gaurav

2

자동으로 호출 되었습니까? 아니면 호출하는 위젯에 코드가 있습니까?

_started에서 true으로 설정했기 때문에 호출하는 것이 좋습니다. 이는 동작 및/또는 레이아웃을 결정하기 위해 많은 위젯에서 사용됩니다. 대부분의 위젯은 (당신이 보았 듯이) 당신이 그것을 부를 것을 요구합니다.

startup은 하위 위젯을 제어해야하는 복합 위젯에 많이 사용됩니다.

기본적으로 dijit._Widget에서 상속받은 모든 항목은 인스턴스화 후에 시작을 호출해야합니다.

편집 : 기사 자체와 코멘트에 조금 시동에 대해 설명는 Dijit 라이프 사이클에 대한 article on SitePen을있다

. 하지만 2 년이 넘었고 상황이 바뀌 었다고 생각합니다.

O'Reilly dojo book도 시작에 대해 이야기하지만 그것은 컨테이너 위젯에서 호출되어야한다고합니다. 그래도 그리드에서 호출해야했기 때문에 이해가되지 않습니다.

아이를 위젯에 추가하기 전에 전화하지 않는 한 전화를 걸면 아무런 상처를 입히지 않습니다. 나는 항상 그것을 부르라고 말하고 싶다.

+0

방금 ​​다시 시도 했으므로 옳습니다. 내 자신의 위젯조차도, 나는 startup()을 직접 호출해야한다. Dojo Campus의 dijit.layout.ContentPane (http://docs.dojocampus.org/dijit/layout/ContentPane)에 대한 예제는 startup() 메소드를 호출하지 않습니다. 이 위젯은 어떨까요? – Philippe

+0

흠, 네 말이 맞아. 이 예제에서 시작이 호출되지 않은 이유는 확실하지 않습니다. 나는 항상 그것을 습관이라고 불렀다. – seth

0
startup (originating from dijit._Widget) 

마크 업에서 선언 된 하위 위젯의 경우이 메소드는 위젯과 모든 하위 위젯이 만들어지면 자동으로 실행됩니다. 따라서, 이것은 아동 위젯이 안전하게 어린이를 참조 할 수있는 최초의 안전한 장소입니다. 간단하게 들릴 수 있듯이이 작업은 종종 postCreate에서 시도되며 일관성없는 동작으로 인해 검색 및 복구가 어려울 수 있습니다. has-a 관계의 일부로 다른 하위 위젯을 포함하는 프로그래밍 방식으로 작성된 위젯의 경우, 모든 하위 위젯이 작성되었을 때 수동으로 startup을 호출해야합니다. 자식을 포함하는 프로그래밍 방식으로 만든 위젯에 대해 직접 호출해야하는 이유는 모든 자식 위젯을 추가하지 않으면 크기 조정 및 렌더링을 계속 진행하는 것이 적절하지 않기 때문입니다. (그렇지 않으면 많은 잘못된 시작이있을 수 있습니다.)이 메서드는 dijit 생성 중에 발생하는 사용자 지정 동작을 재정의 할 수있는 최종 메서드 스텁입니다.

관련 문제