2017-09-13 6 views
0

내가 좋아하는 뷰 모델에 저장이ExtJS 5.x 저장로드 후 격자보기 (viewConfig)를 변경하는 방법은 무엇입니까?</p> <pre><code>Ext.define('MyApp.page.PageModel', { extend: 'Ext.app.ViewModel', //... stores: { Posts: { model: //... } } }); </code></pre> <p>와 같은 그리드 :

Ext.define('MyApp.page.MainView', { 
    extend: 'Ext.panel.Panel', 
    //... 

    initComponent: function() { 
     var me = this; 
     //... 

     me.items = [ 
      { 
       xtype: 'grid', 
       bind: { 
        store: '{Posts}' 
       }, 
       columns: [ /* ... */ ], 
       viewConfig: { 
        getRowClass: function (record) { 
         //... 
        } 
       } 
      } 
     ]; 

     me.callParent(arguments); 
    } 
}); 

어떻게 (내 경우) 저장로드 후에 그리드보기를 변경할 수 있습니까?

나는 그리드 이벤트 ( beforerenderviewready)에서 monaddManagedListener 방법을 사용하려하고 나는 그 그리드 이벤트 내부에 저장하는 onaddListener 방법을 사용했지만,이 솔루션은 작동하지 않습니다.

누군가 아이디어가 있습니까?

의 ExtJS 6에서
+0

? 실제 설정이 설정된 위치 및 방법을 찾아야합니다 (예 : GridView에서 getRowClass 함수를 덮어 쓰면 런타임에 getRowClass 함수를 변경할 수 있습니다 :'grid.getView(). getRowClass = function() {...}'. 이후에 새로운 함수가 적용되도록 격자 ('grid.getView(). refresh()')를 다시 렌더링해야 할 수도 있습니다. – Alexander

+0

'grid'의'viewConfig'에서'emptyText' 매개 변수를 변경하고 싶습니다. 하지만 저장소를로드 한 후에 만이 작업을 수행해야합니다. 그리고 당신의 솔루션은 문제를 해결하지 못합니다. 모든 상점 이벤트에서 상위 컴포넌트 (내 경우에는 '그리드')에 액세스 할 수 없기 때문입니다. – vitaliklibra

답변

0

난 그냥 가게로드 이벤트 전에 emptyEl 및 viewEl을 취소, Ext.view.AbstractView에 대한 재정의를 사용하고 여기에

store.on('beforeload', function() { 
    me.clearEmptyEl(); 
    me.clearViewEl(); 
}); 

내 전체 재정의 당신이 변경 원하는 작업

Ext.define('Ext.overrides.view.AbstractView', { 
    override: 'Ext.view.AbstractView', 

    onBindStore: function(store, initial, propName) { 
     var me = this; 

     me.setMaskBind(store); 
     // After the oldStore (.store) has been unbound/bound, 
     // do the same for the old data source (.dataSource). 
     if (!initial && propName === 'store') { 
      // Block any refresh, since this means we're binding the store, which will kick off 
      // a refresh. 
      me.preventRefresh = true; 
      // Ensure we have the this.store reference set correctly. 
      me.store = store; 
      me.bindStore(store, false, 'dataSource'); 
      me.preventRefresh = false; 
     } 
     store.on('beforeload', function() { 
      me.clearEmptyEl(); 
      me.clearViewEl(); 
     }); 
    } 
}); 
+0

많은 감사, @ A.Pokidin !!! 그것은 내가 원하는 것만은 아니지만 당신의 솔루션을 시도해 보았습니다. 티! ExtJS 구성 요소의 재정의는 오늘 나를 위해 그렇게 어렵습니다. 그래서 당신은 내 문제에 대해 저를 도왔습니다! 좋은 하루 되세요)) – vitaliklibra

0

이 함수 setEmptyText 당신을 위해이 작업을 수행 할 그리드로 볼 수 있습니다 :

initComponent: function() { 
    var me = this; 
    //... 

    me.callParent(arguments); 
    me.getStore().on('load', function() { 
     me.setEmptyText(...); 
    }) 
} 

를 ExtJS에 5에서, 당신은 당신의 자신에 할 필요가 :

me.getStore().on('load', function() { 
     var emptyText = 'Test empty text'; 
     me.getView().emptyText = '<div class="' + me.emptyCls + '">' + emptyText + '</div>'; 
     me.getView().refresh(); 
    }) 

Relevant fiddle 렌더링 후 3 초 후에 매장을로드합니다.

+0

고맙습니다. @Alexander! 당신의 예제는 잘 작동하고 미래의 기능을 위해 그것을 저장합니다. 필자의 경우이 솔루션을 사용할 수 없습니다. 왜냐하면'me'는 그리드가 아니기 때문에 - 부모 패널이기 때문에 모든 코드를 리팩터링해야합니다. = ( – vitaliklibra

+0

아니요, . 당신은'var grid = me.down ('grid')'을 사용할 수 있고, 그 후에 "me"의 모든 인스턴스를 "grid"로 바꾼다. – Alexander

+0

나는 (질문을하기 전에) 내 프로젝트에서 내 사건을 부르지 않는 리스너 (당신의 바이올린 예제에서와 같이). 나는 어떤 행동으로 그의 행동을 막을 수 있다고 생각한다. 그러나 정확히 무엇을 찾을 수 없는지 모르겠다. – vitaliklibra