ExtJS 5.0 - 在覆盖中移动组件

ExtJS 5.0 - moving components in overrides

我们有来自第三方的代码,我们不允许直接修改,只能使用覆盖。

在其中一种形式上,通过更改某些组件的顺序可以更好地为客户服务。我可以在 DOM 内完成此操作,但这种方法非常脆弱,可能会导致框架出现问题。我在 Ext.container.Container 中查看了 moveBeforemoveAfter,但坦率地说,它们不起作用。

我正在寻找 1) 覆盖的最佳位置,例如视图的 constructor,或者视图的 initComponent,或者视图控制器的覆盖,等等 2) 如果有任何 reliable ExtJS 方法来移动组件.

例如initComponentXYView.js

中覆盖
initComponent: function () {
    this.callParent([]);
    // Get the components, X and Y, error checking omitted
    var X = this.query('*[itemId=X]')[0];
    var Y = this.query('*[itemId=Y]')[0];
    // Move X before Y
    // This doesn't work properly -- the layout is messed up!
    this.insertBefore(X, Y);
}

重申一下,我更愿意在 ExtJS 中执行此操作,并尽可能避免 DOM 操作。

您可以从容器中取出组件并重新插入。语法是

.remove( component, autoDestroy ) : Ext.Component

其中 autoDestroy === false 使组件保持活动状态。然后使用

.insert( index, component ) : Ext.Component

如果您在 initComponent 中这样做,您可能做错了,因为您仍然可以访问配置对象并且应该直接操作它们。

出于性能原因暂停多个插入的布局:.suspendLayouts()(全局或每个容器)。

使用文档,它们非常好:https://docs.sencha.com/extjs/5.1/5.1.0-apidocs/#!/api/Ext.container.Container

PS:网格行通过商店、css 和自定义渲染器进行操作,不要直接触摸 dom。

更新 您将通过在构造函数中操作配置来获得最佳性能,因为框架需要做的工作更少。 initComponent实际上是在组件构造函数中调用的,所以几乎是一样的。

在构造函数中,您将获得如下配置:

constructor: function(config) {
//...
}

在 initComponent 中,配置已经是对象的一部分。通过 callParent 调用父项时请注意顺序。通过迭代项目-属性 找到您的子项目,例如通过 Ext.Array.findBy 并查找 itemId。使用 javascript 本机方法移动项目,例如 Array.splice().

如果性能不重要,请在稍后阶段移动您的组件,例如在 afterrender 事件中。在这里您可以使用 extjs 方法来查找和移动组件,例如down() remove() insert().

您需要选择正确的父级才能调用 moveBefore。我通过查找 X 和 Y 的父级修改了您的代码,使用 parentX 删除 X,然后使用 parentY 将 X 移动到 Y 旁边:

initComponent: function () {
    this.callParent([]);
    // Get the components, X and Y, error checking omitted
    var X = this.query('*[itemId=X]')[0];
    var Y = this.query('*[itemId=Y]')[0];
    // Move X before Y
    // Revised code follows
    // Get direct parents
    var parentOfX = X.findParentBy(function (container, me) {return !(container == me);});
    var parentOfY = Y.findParentBy(function (container, me) {return !(container == me);});
    // Remove first to be safe, don't autodestroy
    X = parentOfX.remove(X, false);
    // Reposition under the correct parent
    parentOfY.moveBefore(X, Y);
}

我已经作为 initComponent 覆盖进行了测试,它似乎工作正常。