2013-03-14 92 views
0

您好我正在使用ExtJs和flickr API創建一個flickr搜索。當我使用XTemplate在面板中渲染圖像時,檢索到json響應後,div被添加到它之前的div中。它成爲包含圖像的上述div的孩子。Extjs XTemplate無法正確呈現

負責它的代碼是這樣的:

JSONPStore.on('load', function(){ 

var record = JSONPStore.getAt(0); 

if(record){ 
    data = record.raw.photos.photo; 
    //console.log(JSONPStore); 
    var newEl = Ext.create('Ext.panel.Panel', { 
     width: 1240, 
     margin: '0 20 0 20', 
     id: 'pnlEl', 
     store: JSONPStore, 
     overflowY: 'auto', 
     items: [ 
      { 
       xtype: 'panel', 
       id: 'toBeAdded', 
       overflowY: 'auto', 
       width: 600, 
       layout: 'fit', 
       style: "margin:15px", 
        bodyStyle: "padding:5px;font-size:11px;", 
        listeners:{ 
         render: function(){ 
          var tpl = new Ext.XTemplate(
            '<tpl for=".">', 
             //'<div class="actualImg">', 
              '<div>', 
              '<span>{title}</span>', 
              '<img src="http://farm{farm}.staticflickr.com/{server}/{id}_{secret}.jpg"', 
              '</div>', 
            '</tpl>' 

         ); 
         //console.log(this); 
         tpl.append(this.body, data); 

        } 
       } 
      } 
     ] 
    }); 

    if(vport.layout.align === 'stretch'){ 
     vport.add(newEl) ; 
     vport.doComponentLayout(); 
    } 

} 
else{ 
    console.log('Not Defined'); 
}JSONPStore.on('load', function(){ 

var record = JSONPStore.getAt(0); 

if(record){ 
    data = record.raw.photos.photo; 
    //console.log(JSONPStore); 
    var newEl = Ext.create('Ext.panel.Panel', { 
     width: 1240, 
     margin: '0 20 0 20', 
     id: 'pnlEl', 
     store: JSONPStore, 
     overflowY: 'auto', 
     items: [ 
      { 
       xtype: 'panel', 
       id: 'toBeAdded', 
       overflowY: 'auto', 
       width: 600, 
       layout: 'fit', 
       style: "margin:15px", 
        bodyStyle: "padding:5px;font-size:11px;", 
        listeners:{ 
         render: function(){ 
          var tpl = new Ext.XTemplate(
            '<tpl for=".">', 
             //'<div class="actualImg">', 
              '<div>', 
              '<span>{title}</span>', 
              '<img src="http://farm{farm}.staticflickr.com/{server}/{id}_{secret}.jpg"', 
              '</div>', 
            '</tpl>' 

         ); 
         //console.log(this); 
         tpl.append(this.body, data); 

        } 
       } 
      } 
     ] 
    }); 

    if(vport.layout.align === 'stretch'){ 
     vport.add(newEl) ; 
     vport.doComponentLayout(); 
    } 

} 
else{ 
    console.log('Not Defined'); 
} 

},這一點);

我想創建一個與面板內的div類似的結構。 但這是在其他divs內部創建div。

謝謝。

回答

3

有許多問題與您的代碼:

  • 這是overnesting的一個經典案例,你不需要的內板
  • 外板應該是一個單獨的類,那麼你可以這實例化
  • Ext.panel.Panel不知道關於商店的任何信息,因此將其分配給它什麼都不做。你可能想看看Ext.grid.Panel而不是
  • id財產應該避免,除非絕對必要;此id直接轉換爲DOM,如果您稍後嘗試重複使用此組件,則會發生異常
  • 在這種情況下,佈局無關,它用於佈置容器的子組件組件。既然有沒有內板,layout是多餘
  • 模板
  • HTML被打破:你打開兩個div但接近只有一個,而img標籤是沒有很好地形成
  • 你不需要創建和應用每次渲染組件時使用模板;事實上,這樣做可能是最糟糕的表現方式。模板分配給tpl配置的外板和調用它update當數據到達

你可能想看看數據視圖例如:http://docs.sencha.com/ext-js/4-2/#!/example/view/data-view.html

+0

我也想使用的東西像這樣的數據視圖 – 2013-03-15 09:05:22