2014-03-25 72 views
1

我使用以下代碼ExtJs的從相同的觀點

var reader = Ext.create('Ext.view.ReaderWindow', {}); 
reader.show(); 

裏面ReaderWindow視圖上點擊一個標籤元件開口的視圖,我打開同一視圖中打開的圖(使用上面的代碼)但是內容不同。

一旦我關閉了我第二次打開的ReaderWindow。我無法看到我首先打開的ReaderWindow。

我的問題是如何使用相同的觀點兩次。換句話說,如何從視圖本身開啓相同的視圖。

Ext.define('Ext.view.ReaderWindow', { 
extend: 'Ext.window.Window', 
alias: 'widget.reader', 

id: 0, 
file_path: '', 
file_title: '', 
file_type: '', 
id: 'reader', 
itemId: 'reader', 
maxHeight: 800, 
maxWidth: 900, 
minHeight: 300, 
minWidth: 500, 
layout: { 
type: 'anchor' 
}, 
title: 'File Reader', 
modal: true, 

initComponent: function() { 
var me = this; 

Ext.applyIf(me, { 
items: [ 
{ 
xtype: 'form', 
anchor: '100% 100%', 
id: 'reader_form', 
itemId: 'reader_form', 
maxHeight: 800, 
maxWidth: 900, 
minHeight: 300, 
minWidth: 500, 
autoScroll: true, 
bodyPadding: 10, 
items: [ 
{ 
xtype: 'displayfield', 
anchor: '100%', 
id: 'file_contents', 
itemId: 'file_contents', 
maxWidth: 900, 
minWidth: 50, 
hideLabel: true, 
name: 'file_contents' 
} 
] 
} 
], 
dockedItems: [ 
{ 
xtype: 'toolbar', 
anchor: '100% 5%', 
dock: 'bottom', 
id: 'reader_toolbar', 
itemId: 'reader_toolbar', 
items: [ 
{ 
xtype: 'tbfill' 
}, 
{ 
xtype: 'button', 
handler: function(button, event) { 
me.destroy(); 
}, 
id: 'close_btn', 
itemId: 'close_btn', 
text: 'Close', 
tooltip: 'Close the file reader window.' 
} 
] 
} 
], 
listeners: { 
beforerender: { 
fn: me.reader_windowBeforeRender, 
scope: me 
} 
} 
}); 

me.callParent(arguments); 
}, 

reader_windowBeforeRender: function(component, eOpts) { 

this.setTitle(this.file_title + ' for ID ' + this.id); 

this.setFormTitle(this.file_path); 




Ext.model.FileReaderModel.load(this.id, { 
params: { 
'file':  this.file_path, 
'file_type': this.file_type 
}, 
success: function(file_reader) { 

var contents_field = Ext.ComponentQuery.query('[name=file_contents]')[0]; 

var contents = file_reader.get('file_contents'); 
var pattern = /(\/.*?\.\S*)/gi; 
contents = contents.replace(pattern, "<a href='#' class='samplefile'>$1</a>"); 

contents_field.setValue('<pre>' + contents + '</pre>'); 

Ext.select('.samplefile').on('click', function() { 
var sample_file_path = this.innerHTML; 

var Id = this.id; 

var reader = Ext.create('Ext.view.ReaderWindow', { 
id: Id, 
file_path: sample_file_path, 
file_title: 'Sample File', 
file_type: 'output' 
}); 

reader.show(); 

}); 
}, 
failure: function(file_reader, response) { 
} 
}); 



}, 

setFormTitle: function(file_path) { 
var form_panel = Ext.ComponentQuery.query('#reader_form'); 
form_panel[0].setTitle('File is: ' + file_path); 

} 

}); 
+0

如果你從'Ext.view.ReaderWindow'發佈代碼會很有幫助,因爲你的類聲明中可能有一些「靜態」,當第二個實例關閉時它會被銷燬。換句話說,這兩個實例實際上共享了一個你不希望他們共享的對象。 –

+0

你的'Ext.view.ReaderWindow'聽起來像是'Ext.window.Window'的擴展,而不是'Ext.view.View',所以我猜你可能需要'closeAction:'hide'',但這是有點跳躍,看到你正在創造一個新的實例...但像喬霍洛威說,沒有更多的代碼很難說。 – incutonez

+0

甚至在關閉第二個窗口之前。背景中的第一個窗口似乎只有佈局形狀,並且內部沒有內容。 – sooners

回答

0

一個很大的問題,我看到的是,你是給你的一些組件的非唯一id財產。當指定id時,ExtJS將其用作底層DOM元素的ID,而不是生成唯一的元素。這幾乎肯定不是您想要的可重用組件,因爲ID需要在DOM中是唯一的。

當你構建頂層窗口對象即使你生成一個唯一id,其子組件(reader_formfile_contents等)沒有得到一個唯一的id

換句話說,當您顯示第二個窗口時,您現在有多個具有相同ID的DOM元素並且會打破DOM。在我的ExtJS應用程序中,我尚未找到覆蓋id屬性的有效用例,但這並不意味着沒有一個。這很可能是全球腳手架的元素,或者你的應用程序只保證一個特定組件的實例將被實例化的東西。

可以使用itemId,因爲這是一個ExtJS構造,不會被翻譯成DOM。除了在ExtJS組件層次結構和選擇器API的上下文中它更直觀,它爲您提供了類似於DOM元素上的ID的功能。

我的建議是從組件移除id財產,並讓ExtJS的生成唯一的人對你和槓桿itemId只有在你絕對必須在組件上的已知標識符。

+0

感謝刪除id和使用itemid獲取元素的工作。非常感謝。 – sooners