2017-12-29 36 views
0

ExtJS를 처음 접했습니다. 스크립트 도중 패널을 제거하려고하는데 한 번만 패널을 추가 할 수 있습니다. 내가 다시 추가하려고하는 순간 그것은 오류 나는 기본적으로 그냥 제거하고 취소 버튼을 누를 경우에 패널을 추가ExtJS 3.2 한 번만 패널을 추가 할 수 있습니다.

TypeError: b.getPositionEl(...).dom is undefined 
 
Ext.layout.ContainerLayout<.isValidParent() 
 
ext-all.js:7 
 
Ext.layout.ContainerLayout<.renderAll() 
 
ext-all.js:7 
 
Ext.layout.ContainerLayout<.onLayout() 
 
ext-all.js:7 
 
Ext.layout.AutoLayout<.onLayout() 
 
ext-all.js:7 
 
Ext.layout.ContainerLayout<.layout() 
 
ext-all.js:7 
 
Ext.Container<.doLayout() 
 
ext-all.js:7 
 
Ext.Container<.doLayout() 
 
ext-all.js:7 
 
restart() 
 
RunScript:138 
 
h.Event.prototype.fire() 
 
ext-all.js:7 
 
h.Observable.prototype.fireEvent() 
 
ext-all.js:7 
 
.onClick() 
 
keyscript-all.js:4 
 
I()

를받을 수 있습니다. 계속 버튼을 누르면 모든 것이 잘 표시되고, 새 패널이 표시되고 수집 된대로 데이터가 렌더링되며 오류가 표시되지 않습니다. 하지만 취소 버튼을 누르면 제거하려는 패널은 사라지지만 일단 위에서 설명한 오류가 발생하면 optionPanel을 추가하려고 시도합니다. 그러나 완전히 다른 패널을 추가 할 수 있으며 오류가 표시되지 않습니다.

var workPanel = new CR.FormPanel({ 
 
    id: 'workPanel', 
 
    title: 'Bad Address Workflow', 
 
    region: 'center', 
 
    frame: true, 
 
    labelWidth: 300, 
 
    autoScroll: true, 
 
    bodyStyle: { 
 
     padding: '5px', 
 
     font: '12px arial,tahoma,helvetica,sans-serif' 
 
    }, 
 
    buttons:[ 
 
     { 
 
      text: 'Post', 
 
      listeners: { 
 
       click: doPost 
 
      } 
 
     }, 
 
     { 
 
      text: 'Cancel', 
 
      listeners: { 
 
       click: restart 
 
      } 
 
     } 
 
    ], 
 
    buttonAlign: 'left' 
 
}); 
 

 
var optionPanel = new CR.FormPanel({ 
 
    id: 'optionPanel', 
 
    title: 'Bad Address Workflow', 
 
    region: 'center', 
 
    frame: true, 
 
    labelWidth: 175, 
 
    bodyStyle:'padding:5px 5px 0', 
 
    defaults: { 
 
     width: 230 
 
    }, 
 
    items: [ 
 
     { 
 
     xtype: 'crOptionField', 
 
     crColumnDescription: 'Choose Bad Address Workflow', 
 
     crColumnName: 'workflowOptions', 
 
     crOptions: [ 
 
      ["",""], 
 
      ["0","Set Bad Address"], 
 
      ["1","Remove Bad Address"] 
 
     ] 
 
     } 
 
    ], 
 
    buttons: [ 
 
     { 
 
     text: 'Continue', 
 
     listeners: { 
 
      click: function(button,event){ 
 
       var fields = optionPanel.find('crColumnName','workflowOptions'); 
 

 
       if(parseInt(fields[0].crGetNewContents()) === 0){ 
 
        workflow = 0; 
 
        getMemberData(); 
 
       }else if(parseInt(fields[0].crGetNewContents()) === 1){ 
 
        workflow = 1; 
 
        getMemberData(); 
 
       }else{ 
 
        CR.Core.displayExceptions({ items: ['You have not selected an option.'] }); 
 
       } 
 
      } 
 
     } 
 
     } 
 
    ], 
 
    buttonAlign: 'left' 
 
}); 
 

 
var container = new Ext.Container({ 
 
    id: 'container', 
 
    frame: true, 
 
    region: 'center', 
 
    bodyStyle:'padding:5px 5px 0', 
 
    defaults: { 
 
     xtype: 'container' 
 
    } 
 
}); 
 

 
Ext.onReady(function(){ 
 
    
 
    container.add(optionPanel);   
 
    CR.Core.viewPort = new Ext.Viewport({ 
 
    layout: 'border', 
 
    region: 'center', 
 
    items: [container] 
 
    }); 
 

 
}); 
 

 
function restart(){  
 
    container.remove(workPanel); 
 
    container.add(optionPanel); 
 
    CR.Core.viewPort.doLayout(); 
 
} 
 

 
function getMemberData(){ 
 
    
 
    container.remove(optionPanel); 
 
    container.add(workPanel); 
 
    CR.Core.viewPort.doLayout(); 
 
    
 
    //My data collection process 
 
}

어떤 도움

이 크게 감사합니다.

답변

0

예. container에 여러 시간을 추가 할 수 있습니다. 당신이보기에서 component을 제거 remove 방법을 사용할 때이 오류의 이유 오류를

TypeError: b.getPositionEl(...).dom is undefined

입니다 점점. component이 (가) dom에서 영구적으로 삭제됩니다. 다시 시도 할 때 undefined을 입력하면 오류 TypeError: b.getPositionEl(...).dom is undefined이 생성됩니다.

이 솔루션의 경우 componentreturnfunction에서 항상 만들어야합니다.

FIDDLE에서 필자는 코드를 사용하여 데모를 만들고 약간 수정했습니다. 이것이 당신을 인도하거나 당신의 요구 사항을 성취하도록 도와 줄 수 있기를 바랍니다.

코드 조각이

Ext.onReady(function() { 
    //ReSet view set optionPanel 
    function restart() { 
     container.remove(Ext.getCmp('workPanel')); 
     container.add(optionPanel()); 
     doLayout(); 
    } 
    //Remove optionPanel and add workPanel in container 
    function getMemberData() { 
     container.remove(Ext.getCmp('optionPanel')); 
     container.add(workPanel()); 
     doLayout(); 
    } 
    //update layout of view 
    function doLayout() { 
     container.doLayout(); 
    } 
    //create and return work flow panel 
    var workPanel = function() { 
     return new Ext.FormPanel({ 
      title: 'Bad Address Workflow', 
      id: 'workPanel', 
      region: 'center', 
      frame: true, 
      labelWidth: 300, 
      autoScroll: true, 
      bodyStyle: { 
       padding: '5px', 
       font: '12px arial,tahoma,helvetica,sans-serif' 
      }, 
      buttons: [{ 
       text: 'Post' 
      }, { 
       text: 'Cancel', 
       listeners: { 
        click: restart 
       } 
      }], 
      buttonAlign: 'left' 
     }); 
    } 
    //create and return option panel 

    var optionPanel = function() { 
     return new Ext.FormPanel({ 
      id: 'optionPanel', 
      title: 'Bad Address Workflow', 
      region: 'center', 
      frame: true, 
      labelWidth: 175, 
      bodyStyle: 'padding:5px 5px 0', 
      defaults: { 
       width: 230 
      }, 
      items: [ 
       // create the combo instance 
       new Ext.form.ComboBox({ 
        typeAhead: true, 
        triggerAction: 'all', 
        lazyRender: true, 
        mode: 'local', 
        name: 'workflowOptions', 
        itemId: 'workflowOptions', 
        store: new Ext.data.ArrayStore({ 
         fields: [ 
          'myId', 
          'displayText' 
         ], 
         data: [ 
          ["", ""], 
          ["0", "Set Bad Address"], 
          ["1", "Remove Bad Address"] 
         ] 
        }), 
        valueField: 'myId', 
        displayField: 'displayText' 
       }) 
      ], 
      buttons: [{ 
       text: 'Continue', 
       listeners: { 
        click: function(button, event) { 
         //Get value of seleted value in combotbox 
         //using get component method 
         var value = Ext.getCmp('optionPanel').getComponent('workflowOptions').getValue(); 

         if (value === "0") { 
          workflow = 0; 
          getMemberData(); 
         } else if (value === "1") { 
          workflow = 1; 
          getMemberData(); 
         } else { 
          Ext.Msg.alert('Info', 'You have not selected an option.') 
         } 
        } 
       } 
      }], 
      buttonAlign: 'left' 
     }) 
    }; 
    //Main container that contains option and workflow panel. 
    var container = new Ext.Container({ 
     renderTo: Ext.getBody(), 
     frame: true, 
     region: 'center', 
     bodyStyle: 'padding:5px 5px 0', 
     defaults: { 
      xtype: 'container' 
     }, 
     items: [optionPanel()] 
    }); 
}); 
0

내가 숨기기()와 쇼() 대신 제거() 메소드의 방법을 사용하도록 추천 할 수 있습니다.