Dojo中父模块和子模块之间的关系

Dojo中父模块和子模块之间的关系,dojo,Dojo,我定义了一个自定义Dojo模块,如下所示: define([ "dojo/_base/declare", "dijit/_TemplatedMixin", "dijit/_WidgetBase", "dijit/_WidgetsInTemplateMixin" ], function (declare, _TemplatedMixin, _WidgetBase,_WidgetsInTemplateMixin){ var _Base = declare("

我定义了一个自定义Dojo模块,如下所示:

 define([
    "dojo/_base/declare",
    "dijit/_TemplatedMixin",
    "dijit/_WidgetBase",
    "dijit/_WidgetsInTemplateMixin"
], function (declare, _TemplatedMixin, _WidgetBase,_WidgetsInTemplateMixin){
    var _Base = declare("tt.widget.dashboards._Base", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {

    widgetsInTemplate: true,
    .....
    });
    return _Base;
}
我还定义了另一个模块,它扩展了
\u Base.js
模块,如下所示:
定义1

define([
    "dojo/_base/declare",
    "dojo/text!tt/widget/landingPages/templates/InviteeWelcome.html",
    "dojo/topic",
    "dijit/form/CheckBox",
    "tt/widget/RoundedBox",
    "t/widget/RoundedButton",
    "tt/widget/Dashboards/_Base"
], function (declare, template, topic, CheckBox, RoundedBox, RoundedButton, _Base) {

    var InviteeWelcome = declare("tt.widget.landingPages.InviteeWelcome", _Base,
{
 ...
});
define([
        "dojo/_base/declare",
        "dojo/text!tt/widget/landingPages/templates/InviteeWelcome.html",
        "dojo/topic",
        "dijit/form/CheckBox",
        "tt/widget/RoundedBox",
        "t/widget/RoundedButton",
            "dijit/_WidgetBase",
            "dijit/_TemplatedMixin",
            "dijit/_WidgetsInTemplateMixin"
        "tt/widget/Dashboards/_Base"
    ], function (declare, template, topic, CheckBox, RoundedBox, RoundedButton, _Base, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin) {

        var InviteeWelcome = declare("tt.widget.landingPages.InviteeWelcome", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _Base],
    {
        widgetsInTemplate: true,
        ...
    });
定义2

define([
    "dojo/_base/declare",
    "dojo/text!tt/widget/landingPages/templates/InviteeWelcome.html",
    "dojo/topic",
    "dijit/form/CheckBox",
    "tt/widget/RoundedBox",
    "t/widget/RoundedButton",
    "tt/widget/Dashboards/_Base"
], function (declare, template, topic, CheckBox, RoundedBox, RoundedButton, _Base) {

    var InviteeWelcome = declare("tt.widget.landingPages.InviteeWelcome", _Base,
{
 ...
});
define([
        "dojo/_base/declare",
        "dojo/text!tt/widget/landingPages/templates/InviteeWelcome.html",
        "dojo/topic",
        "dijit/form/CheckBox",
        "tt/widget/RoundedBox",
        "t/widget/RoundedButton",
            "dijit/_WidgetBase",
            "dijit/_TemplatedMixin",
            "dijit/_WidgetsInTemplateMixin"
        "tt/widget/Dashboards/_Base"
    ], function (declare, template, topic, CheckBox, RoundedBox, RoundedButton, _Base, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin) {

        var InviteeWelcome = declare("tt.widget.landingPages.InviteeWelcome", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _Base],
    {
        widgetsInTemplate: true,
        ...
    });
我的问题是上面哪一个是
invitewelcome.js
的正确定义


感谢您在定义1中使用以下层次结构:

_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin => _Base => InviteeWelcome
_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin => _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _Base => InviteeWelcome
在第二个定义中,您使用以下层次结构:

_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin => _Base => InviteeWelcome
_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin => _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _Base => InviteeWelcome
在这种情况下,没有任何区别(除了可能与性能相关)
\u Base
已经从
\u WidgetBase
\u TemplatedMixin
\u WidgetsInTemplateMixin
继承,因此如果您从这3+
\u Base
继承,则
\u Base
将“覆盖”所有这些模块(因为它已经具有其他模块的所有行为)

但如果您要更改定义2so中mixin模块的顺序,则它将变为:

[\u Base、\u WidgetBase、\u TemplatedMixin、\u WidgetsInTemplateMixin]
然后,您在
\u Base
中覆盖的所有内容都将被
\u WidgetBase
\u TemplatedMixin
\u WidgetsInTemplateMixin
中的默认值再次覆盖


我认为您的第一种方法也会起作用,并且可能不会那么混乱。

这里真的没有问题吗

定义1定义2之间的区别只是在
Def 1
中没有添加_WidgetsInTemplateMixin。您拥有的两个自定义模块都扩展了相同的_基类,但是在
def2
中添加了两次相同的混音。唯一的结果是,类是从左到右应用的,因此可能会意外地覆盖某些设置。(尽管您提供的示例并非如此)

此外,随着dojo的发展,如果不需要模块名,最好避免使用它们

这是我今天早上刚刚创建的一个小型定制模块

define( [
    "dojo/text!./TemplatePalette.html",
    "dijit/_Widget",
    "dijit/_TemplatedMixin",
    "dojo/_base/declare",
    "dojo/dom-construct",  
    "dojo/_base/lang",
    "dojo/topic"

    ] ,
    function( template, _Widget, _TemplatedMixin, declare, 
              domConstruct, lang, topic ){    
        return declare( [_Widget, _TemplatedMixin ], { 
    ...
    ...
    ...
    });

实际上,我是Dojo的新手,这些类是由其他人编写的。所以,我只是想确认,如果我在
invitewelcome.js
中包含_Base,我是否需要显式地包含
\u WidgetBase、\u TemplatedMixin、\u WidgetsInTemplateMixin
?因为它们已经包含在
\u Base.js
中,非常感谢。你的解释很好,对我很有帮助。接受你的回答。我发布了一个关于Dojo的问题,你能看一下吗?