2011-07-29 3 views
23

Ext.define()을 사용하여 ExtJS의 새 MVC 방식으로 모든 구성 요소를 작성하고 있습니다.Ext.define()의 initComponent()에 대한 모범 사례

initComponent() 내부의 속성을 정의 하든지 아니면 property: 42,처럼 간단히 설정하여도 다소 어려움을 겪습니다.

널리 채택되는 모범 사례가 있습니까?

나는 initComponent()를 사용하여 사이의 엄청난있어 필요한 경우에만 (예. 나는 동적 뭔가 또는 범위를 설정하고자 할 때) 기능을 짧은 유지하고 좀 추한 this.의 예비 항상 이득이있다, 그 나는 그것을 사용 이전의 속성을 initComponent()으로 옮길 필요가 없기 때문에 더 동적으로 만들고 싶습니다.

불행히도 Sencha의 문서는 그 사실에 대해별로 알려주지 않고 있으며 사용 가능한 예제가 원하는 것처럼 보입니다.

답변

18
기다리는 것은 오버라이드 (override) 할 수 있다는

  • 변수 x, y, width 같은 크기를 정의 할 때 개인 연습, 나는 속성 영역에서 변수를 선언합니다

    , height

  • 변수 또는 사용자 정의 , 예컨대 title, saveBtnTxt, url, fields, iconCls
  • 특별한 접두사가 몇 가지 상수, 쉽게 그리고

내가 선언합니다 그래서 무시되지 않습니다 items하여 obj (this, me)의 범위를 필요 listeners, this.on, Ext.apply(me, {..}) 또는 아무것도, 앉아서 안에 내 initComponent. 또는 모든 것이 설정되기 전에 사용자가 내 구성 요소를 손상시키지 않도록 중요한 변수 중 일부를 무시하여 수정/재정의해야하는 항목.

물론 내 안내 역할을 할 것입니다. 추악한 this 약 2 센트

편집

, 나는 내 응용 프로그램에서 변수 me 널리 사용되는 한, 그것은 this보다 훨씬 청소기 보인다. 스코프를 자주 변경하지 않아도됩니다.

+0

그래, 그게 내 현재의 접근 방식이 될거야. 특정 속성이 마술처럼 역동적 일 때 지루해졌습니다. 그래서 제가 묻고있는 것입니다. '나'에 대해 아직 몰랐는데 ... 나는 ExtJS에 처음 온 사람이다. – hynek

+0

여기에 마법이 없습니다. 소스 코드를 확인하면, 그냥 날아 다니는 '나'가 많이 보일 것입니다. '나'는 실제로 '이'라는 대상에 대한 참조 일뿐입니다. –

+0

마술은 내 마음을 바꾸고 재산을 동적으로 만들 때 내 자신의 코드를 참조하고있었습니다. 솔직한 ExtJS 4 튜토리얼이 부족하기 때문에 시작했을 때 내 앱이 약간 더러워졌습니다 (3.2 스타일). MVCey로 만들기 위해 많이 재 작성해야했습니다. 그 때문에'initComponent()'내부에 많은 속성을 가져 오는데 약간 지루했습니다. 그것이 더 짧다는 것 외에'me'와'this'의 차이점은 무엇입니까? – hynek

-1

귀하의 질문이 정확하게 전달되지는 않지만 귀하에게 도움이 될 수 있습니다.

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, 
..... 
}); 

다음과 같이 사용할 수 있습니다.

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

나는 당신의 답을 정확하게 얻지 못하고있다. 그러나 나는이 신호가 너무 무관하다 : 나는 신호등을 좋아한다. – Mchl

+1

yea .. 그는 내가 추측하는 의견을 묻고있다. :) –

+1

미안하지만, 당신의 대답은'initComponent() '. :) 그러나 신호등은 굉장합니다. – hynek

11

비 프리미티브initComponent에 설정하는 것이 더 낫다고 라이오넬의 답변에 추가하고 싶습니다. (원시에 의해 나는 string, boolean, number를 의미한다). 배열 및 객체는 initComponent입니다.
그래서 정의는 다음과 같아야합니다 : 당신이 initComponent 함수에 모든 비 원시적 CONFIGS을 넣어해야하는 이유

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 
} 

이유는 다른 모든 인스턴스의 CONFIGS가 같은 개체를 참조하는 것입니다. 예를 들어, 당신은 같은합니다 NewClass를 정의하는 경우 : 모든 인스턴스의

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

bbar의이 같은 객체를 참조합니다. 따라서 새로운 인스턴스를 만들 때마다 bbar는 우선 인스턴스에서 사라집니다.

+1

나는 당신의 의견에 동의하는 반면, 나는이 대답이 약간 오도 될 수도 있다고 생각한다. 내 이해는 인스턴스를 만드는 대신 xtype (즉, 개체 구성)을 사용하면 공유되지 않는다는 것입니다. 따라서 적어도 ExtJS 4에서는 InitComponent를 사용하는 것과 비교하여 구성 등록 정보로 객체와 배열을 갖는데 문제가 없어야합니다. 물론 이것에 대한 액세스가 필요하거나 클래스가 다른 사람에 의해 무시되거나 configs를 병합해야하는 경우 InitComponent가 사용됩니다. 자세한 내용은 다음을 참조하십시오. http://skirtlesden.com/articles/config-objects-on-the-prototype – Izhaki

+0

"config {}"블록에 넣으면 어떨까요? – HDave

+0

어리석은 질문 하나 겠지만, extjs가 아닌 것은 무엇입니까? 그 배열 객체 등을 알고 있습니다.하지만 개념은 현명합니다. extjs에서 응용 프로그램을 만드는 동안 차별화하기 란 항상 혼란 스럽습니다. 5. initComponent()를 사용하지 않으면 성능에 해가됩니까? 나는 extjs btw의 새로운입니다. 감사 – agpt