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

What is the best design for Dojo app structure

好的,所以我想我可以更好地表达我想要完成的目标。

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

在 index.php 我想像这样简单地加载我的应用程序...

我的第一个问题是...

这是创建包含其他 widgets/modules 模块的正确方法吗?

我的下一个问题是...

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

现在,它看起来像这样...

但这显然行不通。

对 "bc" 的引用在构造函数中,因此自然不能用于 placeAt 函数调用。

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

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

这是一个很棒的入门项目 - https://github.com/denov/dojo-demo

HomePage.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 declare(null, {
        constructor: function(args){
            this.bc = new BorderContainer(...);
        },
        placeAt: function(){
            this.bc.placeAt(...);
            ...
        }
    });
});

在第一种方案中,bc是一个静态变量,对constructor和placeAt都可见。然后它在 SuperScreen 的所有实例之间共享,如果 SuperScreen 只被实例化一次,这没有什么坏处。您仍然应该使用第二种解决方案,至少 "just in case"。如果您计划多次实例化 SuperScreen,则解决方案 2 是必需的,其中每个 SuperScreen 实例有一个 bc(一个不同的 BorderContainer)。

这就是为什么在只需要一个实例的情况下,我更喜欢 returns 一个普通对象的模块,而不是 class,因为我觉得它传输正确的语义(class 实例化一次并不真的需要是 class 并且 dojo/define 允许这样做,所以我正在使用它!),最后它导致更简单的代码:

  • 在index.php:

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

    define([...], function(...){
        return {
            prepare: function(args){
                this.bc = new BorderContainer(...);
                ...
            },
            placeAt: function(){
                this.bc.placeAt(...);
                ...
        }
    });
    

回答你的问题"should your BorderContainer be in the constructor or elsewhere ?":

  • 您的超级屏幕是 class 而不是小部件 - declare(null, function(...){}) - 构造函数是您唯一的选择。有关 declare 和 dojo classes.

  • 的更多详细信息,请参阅 dojo 文档 here
  • 如果它继承自 dijit/_WidgetBase - declare(_WidgetBase, function(...){}) 它将是一个小部件,在这种情况下,您可以在 dojo 文档 here 中解释选择,postCreate( ) 成为最爱(引用文档,"by far the most important method to keep in mind...");

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