2009-08-17 28 views
8

Tôi tạo các phiên bản dijit.layout.ContentPane, dijit.layout.StackContainerdijit.layout.BorderContainer từ mã JS của tôi.Khi nào tôi phải gọi phương thức startup() của các widget đã được lập trình?

Có vẻ như tôi phải gọi phương thức startup() của các phiên bản được tạo lập trình. Tuy nhiên, tôi không chắc mình phải gọi nó cho mọi tiện ích. Ví dụ: khi tôi thực hiện 'new my.foo.widget()', số startup() được kích hoạt tự động.

Cảm ơn bạn đã giúp tôi hiểu khi gọi phương thức startup()!

Trả lời

15

startup() được định nghĩa trong _Widget và chỉ đơn giản là "một phần của vòng đời". Đây là bước cuối cùng trong vòng đời của widget, và không bắt buộc bởi tất cả các widget. Trường hợp phổ biến nhất mà nó là hoàn toàn cần thiết là khi lập trình tạo widget bố trí. Nó được sử dụng như một cách để ngăn ngừa các tính toán dư thừa khi trẻ cần kích thước. Ví dụ, một 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(); 

Khởi động tự động được gọi bởi trình phân tích cú pháp trong trường hợp parseOnLoad: thực thi đúng hoặc thủ công. Trình phân tích cú pháp trì hoãn việc gọi khởi động() cho đến khi tất cả các tiện ích con tìm thấy đã được tạo ra một cách thích hợp.

dijit.Dialog là một trường hợp lạ. startup() PHẢI được gọi trên widget này.

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

Hầu hết các widget không yêu cầu khởi động gọi, nhưng trong trường hợp một cái gì đó kế thừa từ _Widget không ghi đè lên các thành viên khởi động, cuộc gọi thực chất là một khung cảnh không-op this._started = true; Nếu bạn tạo hàm startup() của riêng bạn, bạn nên gọi this.inherited (arguments) hoặc đơn giản là đặt trình kích hoạt _started theo cách thủ công.

Trong Dojo 1.4, vòng đời ở đây đã được điều chỉnh một chút.Trước đây, một widget với widgetsInTemplate: true sẽ gọi startup() trên các widget con TRƯỚC KHI khởi động() trên parent. Trong 1,4 khởi động của trẻ em() sẽ được gọi là SAU khởi động cha mẹ(). Hành vi này là đệ quy cho tuy nhiên nhiều cấp độ của các vật dụng lồng nhau với widgetsInTemplate: đúng là instantiated. Nó luôn luôn là "an toàn" để gọi .startup(), mặc dù nếu bạn "biết" (vì nó là một tiện ích điểm cuối đơn giản, hoặc mã _Widget tùy chỉnh của riêng bạn), bạn có thể bỏ qua cuộc gọi.

+1

Chỉ để biết thông tin về hành vi reg dijit.Dialog đã thay đổi một chút ngay bây giờ gọi chương trình tự động gọi khởi động từ bên trong hàm – Gaurav

2

Bạn có chắc chắn rằng nó được gọi tự động hoặc bạn có mã trong tiện ích con của bạn gọi nó?

Thực tiễn tốt để gọi nó là vì nó đặt _started thành true được sử dụng bởi một số tiện ích con để xác định hành vi và/hoặc bố cục. Hầu hết các vật dụng yêu cầu bạn gọi nó (như bạn đã thấy).

startup được sử dụng nhiều bởi các tiện ích tổng hợp cần kiểm soát các tiện ích phụ.

Về cơ bản, mọi thứ kế thừa từ dijit._Widget sẽ gọi khởi động sau khi khởi tạo.

CHỈNH SỬA:

Có một article on SitePen về vòng đời dijit mà bàn về khởi động một chút trong bài viết chính nó và trong các ý kiến. Nó đã hơn hai tuổi và tôi nghĩ mọi thứ đã thay đổi.

O'Reilly dojo book cũng nói về khởi động nhưng nó nói nó nên được gọi trên tiện ích con chứa. Tôi đã phải gọi nó trên lưới mặc dù vậy mà không có ý nghĩa hoặc.

Nó không thực sự làm tổn thương bất cứ điều gì bằng cách gọi nó (trừ khi bạn gọi nó trước khi trẻ em được thêm vào widget của bạn). Tôi muốn nói luôn gọi nó.

+0

Tôi vừa thử lại và bạn đã đúng. Ngay cả đối với tiện ích của riêng tôi, tôi cũng phải gọi startup(). Ví dụ của Dojo Campus cho dijit.layout.ContentPane (http://docs.dojocampus.org/dijit/layout/ContentPane) không gọi phương thức startup(). Điều gì về tiện ích này? – Philippe

+0

Hmm, bạn nói đúng. Không hoàn toàn chắc chắn tại sao khởi động không được gọi trên ví dụ đó. Tôi đã luôn luôn gọi nó ra khỏi thói quen. – seth

0
startup (originating from dijit._Widget) 

Đối với tiện ích con được khai báo trong đánh dấu, phương pháp này tự động kích hoạt khi tiện ích con và tất cả tiện ích con đã được tạo. Như vậy, đây là nơi an toàn đầu tiên mà một tiện ích con có thể tham khảo một cách an toàn một đứa trẻ. Đơn giản như nó âm thanh, nhiệm vụ này thường được cố gắng trong postCreate, có thể dẫn đến hành vi không phù hợp có thể khó phát hiện và sửa chữa. Đối với các tiện ích được tạo lập trình có chứa các tiện ích con khác như một phần của mối quan hệ có một, bạn sẽ cần phải tự khởi động riêng khi bạn chắc chắn rằng tất cả các tiện ích con đã được tạo. Lý do bạn cần tự gọi nó cho các widget được lập trình có chứa con là vì nó sẽ không có ý nghĩa để tiến hành định cỡ và hiển thị trừ khi tất cả các widget con đã được thêm vào. (Nếu không, có thể có rất nhiều khởi đầu sai.) Phương thức này là phương thức cuối cùng mà bạn có thể ghi đè cho hành vi tùy chỉnh xảy ra trong quá trình xây dựng dijit.

Các vấn đề liên quan