Когда я должен назвать запуск () методом программно инстанцированных виджетов?

Не был бы, инвертируя число быть быстрее?

// unchecked code, don't kill me if it doesn't even compile.
ulong Reverse(ulong number) {
    ulong result = 0;

    while (number > 0) {
        ulong digit = number % 10;
        result = result * 10 + digit;
        number /= 10;
    }

    return result;
}
8
задан seth 17 August 2009 в 20:50
поделиться

2 ответа

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();

Startup автоматически вызывается анализатором в случае parseOnLoad: true или ручного выполнения. Синтаксический анализатор откладывает вызов метода startup () до тех пор, пока все найденные дочерние виджеты не будут должным образом созданы.

dijit.Dialog - странный случай. Для этого виджета НЕОБХОДИМО вызывать метод startup ().

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

Большинство виджетов НЕ требуют вызова при запуске, но в тех случаях, когда что-то, унаследованное от _Widget, не переопределяет член запуска, вызов по сути является неуправляемым, устанавливая this._started = true; Если вы создаете свою собственную функцию startup (), вам следует либо вызвать this.inherited (arguments), либо просто вручную установить триггер _started.

В Dojo 1.4 жизненный цикл был немного изменен. Раньше виджет с widgetsInTemplate: true вызывал запуск () дочерних виджетов ПЕРЕД запуском () родительского. В 1.4 дочерний запуск () будет вызываться ПОСЛЕ родительского запуска (). Это поведение является рекурсивным, однако для многих уровней вложенных виджетов с widgetsInTemplate: true создаются экземпляры.

Это всегда «безопасно» для вызова .startup (), хотя, если вы «знаете» (потому что это простой виджет конечной точки или ваш собственный код _Widget), вы можете опустить вызов.

15
ответ дан 5 December 2019 в 10:04
поделиться

Вы уверены, что он вызывается автоматически или у вас есть код в виджете, который его вызывает?

Это хорошая практика, поскольку он устанавливает _started в true , который используется многими виджетами для определения поведения и / или компоновки. Для большинства виджетов требуется, чтобы вы его вызывали (как вы видели).

startup активно используется составными виджетами, которым необходимо управлять подвиджетами.

По сути, все, что наследуется от dijit._Widget , должно вызывать запуск после создания.

РЕДАКТИРОВАТЬ:

На SitePen есть статья о жизненном цикле dijit, в которой обсуждается запуск немного в самой статье и в комментариях. Хотя ему больше двух лет, и я думаю, что все изменилось.

O ' В книге Reilly dojo также говорится о запуске, но в ней говорится, что его следует вызывать в содержащихся в нем виджетах. Мне пришлось вызвать его в сетке, так что это тоже не имеет смысла.

На самом деле это ничему не повредит, вызвав его (если вы не вызовете его до того, как дочерние элементы будут добавлены в ваш виджет). Я бы сказал, всегда называй это.

2
ответ дан 5 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: