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

Dijit widget constructor throws "calling chained constructor" error

本文关键字:构造函数 调用 错误 小部 Dijit      更新时间:2023-09-26

我有一个继承自[_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:调用链接构造函数继承

之所以会发生这种情况,是因为Widget生命周期的constructor部分是用一种特殊的链接机制处理的,这种机制是为更灵活地创建Widget而设计的。你可以在这里阅读更多信息,但适用于你的情况的部分是:

父类构造函数总是自动调用,并且总是在子类构造函数之前调用。这种惯例在90%的情况下减少了样板文件。如果它不能满足你的需要,请参阅下面的手动构造函数链接。对于所有其他方法,使用this.inherited(arguments)调用同名的父类方法。

如果您简单地从您的Widget的构造方法中删除this.inherited(arguments)调用,您的问题将得到解决。下面是一个简单的示例,它模拟了Widget的设置并演示了解决方案。