【问题标题】:panel drag and drop is not working in extjs 4.1面板拖放在 extjs 4.1 中不起作用
【发布时间】:2012-01-23 10:04:44
【问题描述】:

此代码在 Extjs 4.0.2a 中运行 但是当转换为4.1 时,它不再起作用并给出错误

Uncaught TypeError: Cannot call method 'query' of undefined

Ext.onReady(function() {

    var panel = new Ext.Panel({
        renderTo: divtag,
        draggable: {
            insertProxy: false,
            onDrag: function(e) {
                var el = this.proxy.getEl();
                this.x = el.getLeft(true);
                this.y = el.getTop(true);
            },
            endDrag: function(e) {
                this.panel.setPosition(this.x, this.y);
            }
        },
        title: 'Panel',
        width: 200,
        height: 100,
        x: 20,
        y: 20
    });
});

【问题讨论】:

  • 我尝试了以下代码,该代码适用于 Component 但不适用于 Panel :( 并引发错误:Uncaught TypeError: Object [object Object] has no method 'ensureAttachedToBody' Ext.onReady(function() { new Ext.Component({ constrain: true, title:'Test', floating: true, style: { backgroundColor: '#fff', border: '1px solid black' }, html: '<h1 style="cursor:move">The title</h1><p>The content</p>', draggable: { delegate:this.body } }).show(); });

标签: javascript extjs extjs4 javascript-framework


【解决方案1】:

显然在这个版本的 Ext 中有一个错误。即使您尝试像这样的面板默认 D'n'D,它也不会工作:

Ext.onReady(function() {
    var panel = new Ext.Panel({
        renderTo: 'divtag',
        draggable: true,
        title: 'Panel',
        width: 200,
        height:100,
        x: 20,
        y: 20
    }); //panel.show(); });
});

我想修补代码以按照您想要的方式工作,这段代码应该可以工作:

Ext.onReady(function() {
    var panel = new Ext.Panel({
        renderTo: 'divtag',
        draggable: {
            insertProxy: false,
            onDrag: function(e) {
                var el = this.proxy.getEl();
                this.x = el.getX();
                this.y = el.getY();
            },
            endDrag: function(e) {
                panel.setPosition(this.x,this.y);
            },
            alignElWithMouse: function() {
                panel.dd.superclass.superclass.alignElWithMouse.apply(panel.dd, arguments);
                this.proxy.sync();
            }
        },
        title: 'Panel',
        width: 200,
        height:100,
        x: 20,
        y: 20
    }); //panel.show(); });
});

作为旁注,我可能建议您不要这样做,因为您可以为可以使用的面板定义自己的 DD,甚至更好的 Ext 已经定义了一个,因此您可以覆盖 Ext 面板来使用默认Ext.util.ComponentDragger,或者在代码中,我建议你这样做:

Ext.override(Ext.panel.Panel, {
    initDraggable: function() {
        var me = this,
            ddConfig;

        if (!me.header) {
            me.updateHeader(true);
        }

        if (me.header) {
            ddConfig = Ext.applyIf({
                el: me.el,
                delegate: '#' + me.header.id
            }, me.draggable);

            // Add extra configs if Window is specified to be constrained
            if (me.constrain || me.constrainHeader) {
                ddConfig.constrain = me.constrain;
                ddConfig.constrainDelegate = me.constrainHeader;
                ddConfig.constrainTo = me.constrainTo || me.container;
            }

            me.dd = Ext.create('Ext.util.ComponentDragger', this, ddConfig);
            me.relayEvents(me.dd, ['dragstart', 'drag', 'dragend']);
        }
    }
});
var panel = Ext.create('Ext.panel.Panel', {
    id: 'test',
    renderTo: 'divtag',
    draggable: true,
    floating: true,
    title: 'Panel',
    width: 200,
    height:100,
    x: 20,
    y: 20
});

面板覆盖中initDraggable 函数的代码取自Ext.window.Window.initDraggable 方法的当前稳定版本。

【讨论】:

    【解决方案2】:

    我能够让它在 4.1 中工作:您必须在 renderTo 元素的 id 周围添加引号,例如:

    renderTo : 'divtag',
    

    没有引号,它正在寻找一个名为 divtag 的未定义变量。

    一旦我运行它就没有错误,然后我只是做了panel.show() 来渲染它。

    【讨论】:

    • 我按照你所说的尝试了代码......在这里但仍然显示相同的错误:Ext.onReady(function() { var panel = new Ext.Panel({ renderTo : 'divtag', draggable: { insertProxy: false, onDrag: function(e) { console.log(this); var el = this.proxy.getEl(); this.x = el.getX(); this.y = el.getY(); }, endDrag: function(e) { panel.setPosition(this.x,this.y); } }, title: 'Panel', width: 200, height:100, x: 20, y: 20 }); });
    • Gotcha - 听起来 divtag 周围的引号是一个问题,但这里的 不是问题。很高兴看到所选答案有效。
    【解决方案3】:

    只是一个建议:Window 组件是一个具有浮动 mixin 的专用面板 - 可能就是您所需要的。

    【讨论】:

    • thnx @dmitry..prob 是窗口允许从标题/标题拖动..我无法从其主体拖动窗口..而如果我已经描述了在 extjs 4.0.2a 中工作的情况,我能够从正文中拖动面板...
    • 您的 html 中是否定义了“divtag”?
    • 是的,这里是代码:<html> <script type="text/javascript"> Ext.onReady(function() { var panel = new Ext.Panel({ renderTo : 'divtag', draggable: { insertProxy: false, onDrag: function(e) { var el = this.proxy.getEl(); this.x = el.getX(); this.y = el.getY(); }, endDrag: function(e) { panel.setPosition(this.x,this.y); } }, title: 'Panel', width: 200, height:100, x: 20, y: 20 }); //panel.show(); }); </script> <body> <div id='divtag'> </div></body></html>
    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2015-02-08
    • 2014-06-22
    相关资源
    最近更新 更多