2012-04-26 3 views
0

내 Sencha Touch 2 앱을 최적화 할 때 여러 번이 문제에 직면했습니다.Ext.Component를 전역 변수로 선언 할 수 있습니까?

DOM을 가중치로 유지해야한다는 것은 분명합니다. 내 응용 프로그램은 Ext.TabBar이고 위의 내용은 Ext.Container입니다. 보기에서 다른보기로 전환 할 때마다 현재보기를 제거하고 해당보기에 새보기를 추가하기 만하면됩니다.

그러나 문제는 맞춤 데이터이있는보기가 있다는 것입니다. 나는 그들이 HTML 컨텐트, 필터링 된 저장소 레코드 등과 같은 내부 데이터를 가지고 있음을 의미합니다. 기본 컨테이너에서 데이터를 제거하면 "상태"를 전역 변수에 저장하려고합니다. 예를 들어, 세부 정보가 포함 된 제품이 포함 된 상거래 앱입니다. 제거 세부 홈페이지 컨테이너에서 패널, 나는 이런 식으로 뭔가하고 싶은 경우 :

var saved_detail_panel = mainContainer.getActiveItem(); 

을 내가 그렇게 할 수 있다면 다시 주요 컨테이너에 그 세부 사항 패널을 추가 할 때, 나중에, 나는 간단하게 사용할 수 있습니다

mainContainer.add(saved_detail_panel); 

여러 번 시도했지만 아직 작동하지 않습니다.

어떤 도움을 주셔서 감사합니다. 고맙습니다. 나는 컨트롤러 내 이벤트 처리기에서이 코드를 삽입하면 :

업데이트

var temp = Ext.create('taxi.view.location.LocationPanel', {showAnimation: null}); 
taxi.main_container = temp; 

그것은 잘 작동하지만 성능이 좋은하지 않습니다.

launch: function(){ 
var temp = Ext.create('taxi.view.location.LocationPanel', {showAnimation: null}); 
}; 

을 만 컨트롤러에서 이것을 사용 : 내가하고 싶은 것은이 같은 단지 내 app.js에 한 번 만드는 것입니다

taxi.main_container = temp; 

이 처음으로 작동 . 하지만 두 번째로 다음 오류가 표시됩니다.

Uncaught TypeError: Cannot call method 'replaceCls' of null 
+0

원더가이 하나의 같은 ST2 버그가 있다면 : http://www.sencha.com/forum/showthread.php?189025-Calling-Ext.Msg.show-with-items-second-time- 오류가 발생했습니다 ... sencha-touch-all-debug.js에서 replaceCls를 약 20 회 호출합니다. Chrome 스택 트레이스에서 어느 것이 호출되는지 확인할 수 있습니까? –

+0

내 나쁜데, 나는 그 핵심 소스를 역 추적하고 디버깅 할만큼 충분히 참을성이 없다. (... ... 일종의 this를 사용하여 임시 해결책을 찾았을 때조차도 : mainContainer.add ({xtype : 'LocationPanel ', showAnimation : null});'여전히 Chrome dev 도구에 이상한 오류가 표시됩니다. Uncaught TypeError :'dom of null '속성을 읽을 수 없습니다. –

답변

1

앱의 "전역 이름 공간"을 사용할 수 있습니까? 그런 다음 앱의 어느 위치에서나 MyApp.savedValue를 참조 할 수 있습니까?

 
Ext.application({ 
    name: 'MyApp', 

// views: [], 
// models: [], 
// stores: [], 
    controllers: ['Main'], 

    launch: function() { 
     MyApp.savedValue = "Hello word"; 
     Ext.Viewport.add(Ext.create('Sencha.view.tablet.MainView')); 
    } 
}); 

Sencha 예제의 또 다른 아이디어는 KitchenSink 데모입니다. app/controllers/Main.js에서 그들은 config : {}에서 설정되고 getter/setter를 통해 액세스되는보기 캐시를 사용합니다. 캐시가 항상 사용 가능하도록 메인 컨트롤러가 항상 존재한다고 생각합니다. 사실, 컨트롤러가 app.js에로드 되어도 계속 유지되지 않을 수 있습니까?이 시도 app/controllers/Main.js

 
config: { 
     /** 
     * @private 
     */ 
     viewCache: [], // Accessed via getViewCache(), setViewCache() 

     ... 
}, 

createView: function(name) { 
     var cache = this.getViewCache(), // Implied getter 
      ln = cache.length, 
      limit = 20, // max views to cache 
      view, i, oldView; 

     // See if view is already in the cache and return it 
     Ext.each(cache, function(item) { 
      if (item.viewName === name) { 
       view = item; 
       return; 
      } 
     }, this); 

     if (view) { 
      return view; 
     } 

     // If we've reached our cache limit then remove something 

     if (ln >= limit) { 
      for (i = 0; i < ln; i++) { 
       oldView = cache[i]; 
       if (!oldView.isPainted()) { 
        oldView.destroy(); 
        cache.splice(i, 1); 
        break; 
       } 
      } 
     } 
     // Create the view and add it to the cache 
     view = Ext.create(name); 
     view.viewName = name; 
     cache.push(view); 
     this.setViewCache(cache); // Implied setter 

     return view; 
    }, 
+0

여러 번 시도했지만 불행히도 전역 네임 스페이스가 작동하지 않습니다. 그런데, 당신은'viewCache'에 대해 더 설명 할 수 있습니까? –

+0

나는 지금까지 내가 알고있는 것을 확장하려고 시도했습니다. 나는 이것을 어느 시점에서 알아 내야 할 것입니다. 당신이 당신의 개발에있어서 조금 더 앞서 있다고 생각하십시오. –

+0

제 업데이트 된 질문을 참조하십시오. 그것은 전에 많은 어려움을 겪었고 그래서 좌절감을 느꼈습니다. –

0

,

var appNS = new Ext.application({ 

    name: 'app', 
    //others 

    launch: function() {  
     appNS.SavedValue = 'getting start..........';  
    }, 

    //others 

}); 

한 다음 컨트롤러

console.log(appNs.SavedValue); 

내가 도움이 될 수있는 희망의 내부에 그것을 사용할 수 있습니다에서

 
controllers: ['Main','FooController', 'BarController'], 

조각 .

+0

불행히도 그것은 로컬 변수가 아니라 글로벌 변수입니다. –

0

또 다른 soln은 ur views를 캐싱하고 있습니다. 실제로 캐싱하지 않습니다. 먼저 응용 프로그램에 배열을 추가하십시오.

Ext.application({ 
name: 'app', 


viewCache: [], 

viewCacheCount: 0, 


launch: function() {  

    this.viewCache.push("app init......."); // push your view 

} 
}); 

는 이것이

ths.getApplication().viewCache.pop();  //pop your view 

원하는 컨트롤러 뭔가 내부에 PIN이 될 수있다 나는 그것이 일부보기/파괴 할 자동차되는 구성 요소의 경우에는 몇 가지 문제를 만들 수 있습니다 잘 모릅니다.

0

autoDestroy: false을 (를) 볼 때보십시오.

Ext.define('JiaoJiao.view.personal.Card', { 

extend: 'Ext.NavigationView', 
xtype: 'personalContainer', 

config: { 

    tab: { 
     title: '个人', 
     iconCls: 'user', 
     action: 'personalTab' 
    }, 

    autoDestroy: false, 

    items: [ 
     { 
      xtype:'personal', 
      store: 'Personals' 
     } 
    ] 
} 
}); 
관련 문제