为什么这个extjs代码在extjs4.0.7中返回null



我在论坛上使用了这个代码,在4.0.2a中没有错误,现在4.0.7给了我错误f为空,所以我用firebug检查了一下,发现

getIframe: function() {
  return this.getTargetEl().child('iframe');
},

this.getTargetEl().child('iframe')返回空

你知道4.0.7为什么会出现这种情况吗?

http://jsfiddle.net/Cu9DZ/

Ext.define('Ext.panel.iframePanel', {
    extend  : 'Ext.panel.Panel',
    alias   : 'widget.iframePanel',
    src             : 'about:blank',
    loadingText     : 'Loading ...',
    loadingConfig   : null,
    renderTpl: [
        '<div class="{baseCls}-body<tpl if="bodyCls"> {bodyCls}</tpl><tpl if="frame"> {baseCls}-body-framed</tpl><tpl if="ui"> {baseCls}-body-{ui}</tpl>"<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>>',
        '<iframe src="{src}" width="100%" height="100%" frameborder="0"></iframe>',
        '</div>'
    ],
    initRenderData: function() {
        return Ext.applyIf(this.callParent(), {
            bodyStyle: this.initBodyStyles(),
            bodyCls: this.initBodyCls(),
            src: this.getSource()
        });
    },
    initComponent: function() {
        this.callParent(arguments);
        this.on('afterrender', this.onAfterRender, this, {});
    },
    /**
     * Gets the iframe element
     */
    getIframe: function() {
        return this.getTargetEl().child('iframe');
    },
    getSource: function() {
        return this.src;
    },
    setSource: function(src, loadingText) {
        this.src = src;
        var f = this.getIframe();
        if (loadingText || this.loadingText) {
            this.body.mask(loadingText || this.loadingText);
        }
        f.dom.src = src;
    },
    resetUrl: function() {
        var f = this.getIframe();
        f.dom.src = this.src;
    },
    onAfterRender: function() {
        var f = this.getIframe();
        f.on('load', this.onIframeLoaded, this, {});
    },
    onIframeLoaded: function() {
        if (this.loadingText) {
            this.body.unmask();
        }
    }
});
var printpanel = Ext.create('Ext.panel.Panel', {
    title       : 'Print',
    width       : 800,
    height      : 300,
    renderTo    : Ext.getBody(),
    bodyPadding : 5,
    layout      : 'fit',
    items:  Ext.widget('iframePanel', {
            border  : false,
            src     : '',
            itemId  : 'ds_print_panel'
            }),
    tbar: ['->',{
                text        : 'Test',           
                listeners: {
                    click: function(){
                        printpanel.down('#ds_print_panel').setSource("http://www.rockstown.com/node/4");
                    }
                }
            }]          
});

我在这里发现了一些错误。

  1. 正如您已经知道的,child('iframe')返回null,因为在Ext4中它选择了一个直接子级(与Ext3相反)。您应该使用down('iframe')
  2. iframePanel中未定义body,请改用getTargetEl()
  3. printpanel.down('#ds_print_panel')也不起作用,你可以使用例如this.findParentByType('panel')

以下是工作示例:http://jsfiddle.net/Cu9DZ/3/

最新更新