从 Sencha ExtJS 4.0 迁移到 ExtJS 4.1

Posted

技术标签:

【中文标题】从 Sencha ExtJS 4.0 迁移到 ExtJS 4.1【英文标题】:Migration from Sencha ExtJS 4.0 to ExtJS 4.1 【发布时间】:2012-11-28 15:58:39 【问题描述】:

我创建一个这样的窗口:

_target = new Ext.Window(
    layer: 'top',
    width: _width,
    height: _height,
    constrainTo: aBody,
    constrain: true,
    renderTo: aBody,
    autoScroll: true,
    flex: 1,
    modal: (targetParams.Modal != undefined) ? targetParams.Modal : false,
    resizable: (targetParams.Resizable != undefined) ? targetParams.Resizable : true,
    minimizable: (targetParams.Minimizable != undefined) ? targetParams.Minimizable : true,
    maximizable: (targetParams.Maximizable != undefined) ? targetParams.Maximizable : true,
    closable: (targetParams.Closable != undefined) ? targetParams.Closable : true,
    maximized: _maximized,
    minimzed: _minimized,
    isInFront: true
);    

然后这样做:

_target.on("render", function (items) 
    if (items.length > 0) 
        this.show();
        this.add(items);
        this.doLayout();
        var buttonText = targetParams.ButtonText || this.title;
        createToolbarButton(this.id, buttonText, targetParams.UIConfigurationId);
     else 
        _target.destroy();
    
);

问题出在this.show();这一行。在 4.0 上,这条线调用了这个函数

show: function()         
    this.callParent(arguments);
    this.performDeferredLayouts();
    return this;
,

但在 4.1 上同一行调用另一个函数:

show: function(animateTarget, cb, scope)         
    var me = this;

    if (me.rendered && me.isVisible()) 
        if (me.toFrontOnShow && me.floating) 
            me.toFront();
        
     else if (me.fireEvent('beforeshow', me) !== false) 
        me.hidden = false;

        if (!me.rendered && (me.autoRender || me.floating)) 
            me.doAutoRender();
        
        if (me.rendered) 
            me.beforeShow();
            me.onShow.apply(me, arguments);

            if (me.ownerCt && !me.floating && !(me.ownerCt.suspendLayout || me.ownerCt.layout.layoutBusy)) 
                me.ownerCt.doLayout();
            
            me.afterShow.apply(me, arguments);
        
    
    return me;
,

其中下一行尝试执行layout.renderChildren(),然后给出错误。

我认为很明显创建的对象是不同的,但我没有看到“升级 4.0 到 4.1”文档中解决了这个问题。

所以我的问题是我必须做些什么来完成这项工作?

提前感谢您的帮助。

更新:

添加窗口后的应用结构如下所示:

ViewPort
North
    ...
West
    ...
Center
    Window
        Panel
            Panel
                Label
                ...
            BorderSplitter
            Panel
                Label
                ...
        Panel
            List
South
    ...

我对代码进行了一些更改,它不再产生该错误。

_target.on("beforeRender", function (items) 
    if (items.length > 0) 
        _target.add(items);
        _target.doLayout();
        var buttonText = targetParams.ButtonText || _target.title;
        createToolbarButton(_target.id, buttonText, targetParams.UIConfigurationId);
     else 
        _target.destroy();
    
);
_target.show();
_target.toFront();

但现在当我调用 _target.add(items); 时它会生成另一个。

此行的错误是“无法获取属性 'dom' 的值”

me.container = container.dom ? container : Ext.get(container);

我尝试分析调用堆栈并找出它给出此错误的原因。当它调用这个函数时:

renderChildren: function () 
    var me = this,
        items = me.getLayoutItems(),
        target = me.getRenderTarget();

    me.renderItems(items, target);
,

其中“this”指的是窗口的布局对象,在我添加项目的位置,调用“getRenderTarget()”返回未定义。然后尝试访问undefined的dom属性,抛出我上面提到的错误。

这是我迷路的地方,因为如您所见,当我创建窗口时,我将一个对象 (aBody) 传递给 renderTo 属性。

有什么想法吗??

【问题讨论】:

你能分享一下确切的错误吗?另外,为什么在“渲染”中调用 this.show()? 错误是“对象不支持这个属性或方法'renderChildren()'”。我在渲染中调用它以仅显示窗口,以防有任何要在其中渲染的项目。 使用这个事件(beforeshow):docs.sencha.com/ext-js/4-1/#!/api/… 如果你不想显示窗口,则在事件中返回 false。 我做了一些更改,请检查我的问题的更新 【参考方案1】:

这与布局有关。布局“适合”它似乎可以工作。

【讨论】:

以上是关于从 Sencha ExtJS 4.0 迁移到 ExtJS 4.1的主要内容,如果未能解决你的问题,请参考以下文章

无法将 extjs 3 迁移到 extjs 4

如何从 Sencha extjs 获取存储价值

在 Sencha ExtJS 现代中定义启动图像和图标

如何将标签添加到 ExtJS Slider 控件的任一端?

在 Sencha Touch 中重用 ExtJS 的模型和存储

从单个商店动态创建多个 Sencha ExtJS 商店