2011-07-29 32 views
23

Tôi đang viết tất cả các thành phần của mình trong thời trang MVC mới của ExtJS sử dụng Ext.define().Thực tiễn tốt nhất liên quan đến initComponent() trong Ext.define()

Tôi gặp khó khăn trong việc xác định thuộc tính bên trong của initComponent() hoặc đơn giản là đặt chúng như property: 42,.

Có thực tiễn tốt nhất được chấp nhận rộng rãi không?

Tôi đang kinh ngạc khi sử dụng initComponent() chỉ khi cần thiết (ví dụ: khi tôi muốn điều gì đó năng động hoặc đặt phạm vi) giữ chức năng ngắn hơn và phụ tùng cho tôi một số xấu xí this. s và luôn sử dụng không bao giờ phải di chuyển các tài sản cũ sang initComponent() chỉ vì tôi muốn làm cho nó trở nên năng động hơn.

Thật không may, tài liệu của Sencha không nói nhiều về điều đó và các ví dụ có sẵn dường như làm như họ muốn.

Trả lời

18

thực hành cá nhân, tôi sẽ khai báo các biến trong lĩnh vực bất động sản khi các biến

  • xác định tầm quan trọng, giống như x, y, width, height
  • biến đang chờ để được ghi đè, hoặc tùy biến , như title, saveBtnTxt, url, fields, iconCls
  • một số hằng số, mà sẽ có tiền tố đặc biệt như vậy sẽ không được ghi đè quá dễ dàng

Sau đó, tôi sẽ tuyên bố items, listeners, this.on, Ext.apply(me, {..}) hoặc bất cứ điều gì mà đòi hỏi phạm vi của obj (this, me), ngồi bên trong initComponent của tôi. Hoặc những thứ cần được sửa đổi/ghi đè trước khi mọi thứ được thiết lập để người dùng sẽ không phá vỡ thành phần của tôi bằng cách ghi đè một số biến quan trọng.

Tất nhiên, đó sẽ là hướng dẫn của tôi. 2 cent

EDIT

Về xấu xí this, tôi đã sử dụng các biến me dụng rộng rãi trong ứng dụng của tôi, và có vẻ sạch hơn rất nhiều so với this. Nó giúp tôi thay đổi phạm vi ít thường xuyên hơn.

+0

Được rồi, đó sẽ là cách tiếp cận hiện tại của tôi. Nó chỉ tẻ nhạt khi một số tài sản kỳ diệu trở nên năng động, đó là lý do tại sao tôi hỏi. Chưa biết về 'tôi' ... Tôi khá mới với ExtJS. – hynek

+0

Không có phép thuật ở đây. Chỉ cần kiểm tra mã nguồn của họ, bạn sẽ thấy rất nhiều 'tôi' chỉ bay vòng quanh. 'tôi' chỉ là một ref cho đối tượng 'this' thực sự. –

+0

Phép thuật đã đề cập đến mã của riêng tôi, khi tôi đổi ý và tạo ra một tài sản năng động. Bởi vì thiếu các hướng dẫn ExtJS 4 vững chắc khi tôi bắt đầu, ứng dụng của tôi có một chút bẩn (ví dụ: 3.2 phong cách) và tôi đã phải viết lại rất nhiều để làm cho nó MVCey. Điều đó dẫn đến rất nhiều thuộc tính kéo bên trong 'initComponent()' hơi tẻ nhạt. Vì vậy, có bất kỳ sự khác biệt giữa 'tôi' và' này' bên cạnh thực tế nó ngắn hơn? – hynek

-1

Tôi không nhận được câu hỏi của bạn chính xác nhưng điều này có thể hữu ích cho bạn.

Ext.define('My.Group', { 
// extend: 'Ext.form.FieldSet', 
xtype : 'fieldset', 
config : { 
    title : 'Group' + i.toString(), 
    id : '_group-' + i.toString() 

}, 
constructor : function(config) { 
    this.initConfig(config); 

    return this; 
},  
collapsible: true, 
autoScroll:true, 
..... 
}); 

bạn có thể sử dụng như sau.

handler : function() {      
     i = i + 1; 
     var group = new My.Group({ 
      title : 'Group' + i.toString(), 
      id : '_group-' + i.toString() 
     }); 
     // console.log(this); 
     // console.log(group); 
     Ext.getCmp('panelid').insert(i, group); 
     Ext.getCmp('panelid').doLayout(); 
    } 
+3

Tôi không nhận được câu trả lời của bạn chính xác nhưng nhận xét này cũng không liên quan: Tôi thích đèn giao thông – Mchl

+1

yea .. Anh ấy đang hỏi ý kiến ​​của tôi :) –

+1

Xin lỗi, nhưng câu trả lời của bạn thậm chí không chứa 'initComponent() '. :) Nhưng đèn giao thông thật tuyệt vời. – hynek

11

Tôi muốn thêm vào câu trả lời của Lionel rằng tốt hơn là khai báo bất kỳ cấu hình không không nguyên thủy nào trong initComponent. (Bởi nguyên thủy tôi có nghĩa là chuỗi, boolean và số). Mảng và đối tượng đi vào initComponent.
Vì vậy, định nghĩa nên xem xét như thế này:

Ext.define('My.NewClass', { 
    extend: 'OldClass', 
    // here all primitive configs: 
    cls: 'x-my-cls', 
    collapsible: true, 
    region: 'west', 
    // and so on ... 

    initComponent: function() { 
    // here you declare non-primitive configs: 
    this.tbar = [/* blah-blah */]; 
    this.columns = [/* blah-blah */]; 
    this.viewConfig = {/* blah-blah */}; 
    // and so on ... 

    this.callParent(arguments); 
    } 

    // other stuff 
} 

Lý do tại sao bạn nên đặt tất cả configs phi nguyên thủy vào initComponent là khác configs của tất cả các trường sẽ giới thiệu cho các đối tượng tương tự. Ví dụ: nếu bạn định nghĩa NewClass như:

Ext.define('My.NewClass', { 
    extend: 'OldClass', 
    bbar: Ext.create('Ext.toolbar.Toolbar', { 
    // ... 

bbar s của tất cả các trường hợp sẽ tham chiếu cùng một đối tượng. Và do đó mỗi khi bạn tạo bbar thể hiện mới biến mất khỏi thể hiện nguy hiểm.

+1

Trong khi tôi đồng ý với bạn, tôi nghĩ câu trả lời này có thể hơi gây nhầm lẫn. Sự hiểu biết của tôi là nếu thay vì tạo ra một cá thể sử dụng xtype (có nghĩa là, cấu hình đối tượng), nó sẽ không được chia sẻ. Vì vậy, trong ExtJS 4 ít nhất, không nên có một vấn đề có đối tượng và mảng như các thuộc tính cấu hình (so với sử dụng InitComponent). Tất nhiên, nếu bạn cần quyền truy cập vào lớp này hoặc lớp học của bạn có thể bị người khác ghi đè hoặc bạn cần hợp nhất các cấu hình, thì InitComponent sẽ được sử dụng. Để xem thêm: http://skirtlesden.com/articles/config-objects-on-the-prototype – Izhaki

+0

Nếu bạn đặt nó bên trong khối "config {}" thì sao? – HDave

+0

một câu hỏi ngớ ngẩn, tôi đoán, nhưng tôi muốn biết những gì không phải là nguyên thủy trong extjs? Tôi biết mảng của nó đối tượng vv .. nhưng khái niệm khôn ngoan tôi luôn luôn nhầm lẫn để phân biệt trong khi tạo ra một ứng dụng trong extjs 5. Liệu nó có hại hiệu suất nếu tôi không sử dụng 'initComponent()' ?? Tôi là một mới trong extjs btw. cảm ơn – agpt

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