ExtJS 4.1:覆盖 mixins

Posted

技术标签:

【中文标题】ExtJS 4.1:覆盖 mixins【英文标题】:ExtJS 4.1: Override mixins 【发布时间】:2013-03-06 11:42:40 【问题描述】:

我有一个小问题: ExtJS 4.1 对所有表单字段使用名为“Ext.form.Labelable”的 mixin 来呈现标签。我想更改作为渲染模板的 labelableRenderTpl,以便为所有表单字段在右侧添加一个额外的标签。 我怎样才能覆盖/扩展一个mixin?甚至有可能还是我必须为所有使用 mixin 的类覆盖 labelableRenderTpl?

感谢您的帮助和最诚挚的问候! 曼努埃尔

【问题讨论】:

【参考方案1】:

您可以在此处为Ext.form.Labelable 应用覆盖

Ext.override(`Ext.form.Labelable`, 
    labelableRenderTpl: 'Your Template'
);

这是未经测试的,但它应该可以工作,因为 mixin 的定义与任何其他类一样。你需要知道的是,现在所有类使用这个 mixin 将使用新的模板。如果是可标记的,则此列表很短

Ext.form.FieldContainer Ext.form.field.Base Ext.form.field.htmlEditor

如果您不想全部更改,则需要创建自己的 mixin,例如通过扩展 Ext.form.Labelable 并覆盖 Ext.form.field.Base 以将其应用于所有字段。

您可以找到有关覆盖 here 的更多信息。 (即使某些 SO 社区似乎不喜欢这个问题,您也可以在其中找到一些有价值的信息

更新

正如您已经猜到的那样,问题是在应用覆盖时,mixin 已经被复制到类中,所以这完全是关于时间的,并且可能以硬匹配结束。我建议您从 Ext.form.Labelable mixin 继承,并通过用新的 mixin 覆盖实现,将这个新的 mixin 应用到您需要的所有类。

【讨论】:

您好,非常感谢您的回答。不幸的是,用Ext.override 覆盖mixin 类不起作用。它不影响FieldContainerBaseHtmlEditor。我猜这是因为当我覆盖 mixin 时,mixin 已经应用于此类??我想唯一的解决方法是直接在类中覆盖 mixin 方法?? @mesx 如果阅读了我发布的链接,您会知道当它刚刚混合时您不能覆盖 mixin 方法。现在我测试了它,我必须承认这似乎是不可能的覆盖一个mixin。覆盖和原型都不能完成这项工作。这是一个非常奇怪的行为......我稍后会回顾它并给你反馈。

以上是关于ExtJS 4.1:覆盖 mixins的主要内容,如果未能解决你的问题,请参考以下文章

在两个 mixin 的交集处覆盖 trait 函数

ExtJS - 覆盖默认存储数据

EXTJS 本地化(覆盖类)

ExtJS 'datefield' 验证覆盖

根据不同条件覆盖 ExtJs 4 中的日期字段格式

如何在 SCSS 中使用 Mixin 覆盖引用父选择器