Dijit 小部件构造函数抛出“调用链式构造函数”错误

Posted

技术标签:

【中文标题】Dijit 小部件构造函数抛出“调用链式构造函数”错误【英文标题】:Dijit widget constructor throws "calling chained constructor" error 【发布时间】:2013-03-24 09:27:49 【问题描述】:

我有一个继承自 [_WidgetBase, _TemplatedMixin]Base 类。 Base 工作正常。现在我在另一个不工作的类中继承了这个Base

define([
   "dojo/_base/declare", "dojo/parser", ...
], function(declare, parser, ...)
    return declare("mc.widgets.Base", [_WidgetBase, _TemplatedMixin], 
        templateString: 
            '<div class="mc-note-base">'+
            '</div>',
        constructor: function(argv)
            var self = this.inherited(arguments);
            return self;
        ,
        data: function()

        ,
        postCreate: function()
            ...
        
    )
);

派生类

define([
    "dojo/_base/declare", "mc/base/path", "mc/widgets/Base"
], function(declare, path, Base)
    return declare("mc.widgets.Derived", [Base], );
)

派生类抛出

错误:声明 mc.widgets.Derived:使用继承调用链式构造函数

【问题讨论】:

【参考方案1】:

发生这种情况是因为 Widget 生命周期的 constructor 部分是通过一种特殊的链接机制处理的,该机制旨在更灵活地创建 Widget。您可以read here 了解更多信息,但适用于您情况的部分说:

超类构造函数总是被自动调用,并且总是在子类构造函数之前。该约定在 90% 的情况下减少了样板文件。如果它不符合您的需求,请参阅下面的手动构造函数链接。对于所有其他方法,请使用 this.inherited(arguments) 调用同名的超类方法。

如果您只是从 Widget 的构造方法中删除 this.inherited(arguments) 调用,您的问题将得到解决。 Here is a simple jsfiddle 模仿您的 Widget 设置并演示解决方案。

【讨论】:

以上是关于Dijit 小部件构造函数抛出“调用链式构造函数”错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 dijit.byId w dojox.mobile 小部件

如何从 Dijit FilteringSelect 小部件中删除所有选项?

Dojo dijit.form.select:创建新的选择小部件后,旧小部件的选定值无法更改

如何禁用“dijit.form.FilteringSelect”小部件?

Dijit TabContainer 小部件图标

在Dijit销毁小部件