Dojo应用程序结构的最佳设计是什么

Dojo应用程序结构的最佳设计是什么,dojo,Dojo,好吧,我想我能更好地表达我想要实现的目标 为了节省时间和代码编写,我想创建一个模块/小部件,其中包含其他DIJIT,如BorderContainer、TabContainer等。我希望模块是编程的,而不是基于模板的 在index.php中,我希望像这样加载我的应用程序 我的第一个问题是 这是创建包含其他小部件/模块的模块的正确方法吗 我的下一个问题是 我的SuperScreen.js结构应该是什么样子 现在,看起来像这样 但这显然行不通 对“bc”的引用在构造函数中,因此placeAt函数调

好吧,我想我能更好地表达我想要实现的目标

为了节省时间和代码编写,我想创建一个模块/小部件,其中包含其他DIJIT,如BorderContainer、TabContainer等。我希望模块是编程的,而不是基于模板的

在index.php中,我希望像这样加载我的应用程序

我的第一个问题是

这是创建包含其他小部件/模块的模块的正确方法吗

我的下一个问题是

我的SuperScreen.js结构应该是什么样子

现在,看起来像这样

但这显然行不通

对“bc”的引用在构造函数中,因此placeAt函数调用自然不可用

我的边界容器应该在构造函数中还是其他地方


似乎declare函数允许继承。我很困惑,因为我不想继承BorderContainer,我只想使用它。

这里有一个很棒的入门项目-


非常接近您的SuperScreen.js

这里有一个很棒的入门项目-


非常接近你的SuperScreen.js第一个问题:简短的回答是肯定的

然后,要使bc对placeAt可见,可以在SuperScreen.js中执行此操作:

define([...], function(...){
    var bc;
    return declare(null, {
        constructor: function(args){
            bc = new BorderContainer(...);
        },
        placeAt: function(){
            bc.placeAt(...);
            ...
        }
    });
});
define([...], function(...){
    return {
        prepare: function(args){
            this.bc = new BorderContainer(...);
            ...
        },
        placeAt: function(){
            this.bc.placeAt(...);
            ...
    }
});
或者,您可以这样做:

    define([...], function(...){
        return declare(null, {
        constructor: function(args){
            this.bc = new BorderContainer(...);
        },
        placeAt: function(){
            this.bc.placeAt(...);
            ...
        }
    });
});
在第一个解决方案中,bc是一个静态变量,构造函数和placeAt都可见。然后,它在超级筛选的所有实例之间共享,如果超级筛选只实例化一次,则不会造成任何损害。不过,您还是应该使用第二种解决方案,至少“以防万一”。如果您计划多次实例化超级筛选,那么解决方案2是必需的,其中每个超级筛选实例有一个bc(一个不同的BorderContainer)

这就是为什么在只需要一个实例的情况下,我更喜欢返回普通对象的模块,而不是传递正确语义的类(一个实例化过一次的类实际上不需要是类,dojo/define允许这样做,所以我正在使用它!),最终它会生成更简单的代码:

  • 在index.php中:

    require ([SuperScreen], function(){
        SuperScreen.prepare();
        superScreen.placeAt(document.body);
    });
    
  • 在SuperScreen.js中:

    define([...], function(...){
        var bc;
        return declare(null, {
            constructor: function(args){
                bc = new BorderContainer(...);
            },
            placeAt: function(){
                bc.placeAt(...);
                ...
            }
        });
    });
    
    define([...], function(...){
        return {
            prepare: function(args){
                this.bc = new BorderContainer(...);
                ...
            },
            placeAt: function(){
                this.bc.placeAt(...);
                ...
        }
    });
    
要回答您的问题“您的BorderContainer应该位于构造函数中还是其他位置?”:

  • yourSuperScreen是一个类而不是一个小部件-
    声明(null,函数(…){})
    -构造函数是您唯一的选择。有关declare和dojo类的更多详细信息,请参阅dojo文档

  • 如果它继承自dijit/_WidgetBase-
    declare(_WidgetBase,function(…){})
    ,那么它将是一个小部件,在这种情况下,您可以在dojo文档中解释一个选择,postCreate()是最受欢迎的(引用文档,“到目前为止,要记住的最重要的方法…”)


上面可能回答了您的最后一个问题:不用担心,您实际上只是在使用BorderContainer,而不是继承它。

第一个问题:简短的回答是肯定的

然后,要使bc对placeAt可见,可以在SuperScreen.js中执行此操作:

define([...], function(...){
    var bc;
    return declare(null, {
        constructor: function(args){
            bc = new BorderContainer(...);
        },
        placeAt: function(){
            bc.placeAt(...);
            ...
        }
    });
});
define([...], function(...){
    return {
        prepare: function(args){
            this.bc = new BorderContainer(...);
            ...
        },
        placeAt: function(){
            this.bc.placeAt(...);
            ...
    }
});
或者,您可以这样做:

    define([...], function(...){
        return declare(null, {
        constructor: function(args){
            this.bc = new BorderContainer(...);
        },
        placeAt: function(){
            this.bc.placeAt(...);
            ...
        }
    });
});
在第一个解决方案中,bc是一个静态变量,构造函数和placeAt都可见。然后,它在超级筛选的所有实例之间共享,如果超级筛选只实例化一次,则不会造成任何损害。不过,您还是应该使用第二种解决方案,至少“以防万一”。如果您计划多次实例化超级筛选,那么解决方案2是必需的,其中每个超级筛选实例有一个bc(一个不同的BorderContainer)

这就是为什么在只需要一个实例的情况下,我更喜欢返回普通对象的模块,而不是传递正确语义的类(一个实例化过一次的类实际上不需要是类,dojo/define允许这样做,所以我正在使用它!),最终它会生成更简单的代码:

  • 在index.php中:

    require ([SuperScreen], function(){
        SuperScreen.prepare();
        superScreen.placeAt(document.body);
    });
    
  • 在SuperScreen.js中:

    define([...], function(...){
        var bc;
        return declare(null, {
            constructor: function(args){
                bc = new BorderContainer(...);
            },
            placeAt: function(){
                bc.placeAt(...);
                ...
            }
        });
    });
    
    define([...], function(...){
        return {
            prepare: function(args){
                this.bc = new BorderContainer(...);
                ...
            },
            placeAt: function(){
                this.bc.placeAt(...);
                ...
        }
    });
    
要回答您的问题“您的BorderContainer应该位于构造函数中还是其他位置?”:

  • yourSuperScreen是一个类而不是一个小部件-
    声明(null,函数(…){})
    -构造函数是您唯一的选择。有关declare和dojo类的更多详细信息,请参阅dojo文档

  • 如果它继承自dijit/_WidgetBase-
    declare(_WidgetBase,function(…){})
    ,那么它将是一个小部件,在这种情况下,您可以在dojo文档中解释一个选择,postCreate()是最受欢迎的(引用文档,“到目前为止,要记住的最重要的方法…”)

以上可能回答了您的最后一个问题:不用担心,您实际上只是在使用BorderContainer,而不是从它继承而来。

请阅读请阅读