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

uelo1irk  于 2022-12-08  发布在  Dojo
关注(0)|答案(2)|浏览(171)

好吧,我想我可以更清楚地表达我想完成的事情。
为了保存时间和代码编写,我想创建一个包含其他dijit的模块/小部件,如BorderContainer、TabContainer等等。我希望该模块是编程的,而不是基于模板的。
在index.php中,我想简单地加载我的应用程序,如下所示...

我的第一个问题是...
这是创建一个包含其他小部件/模块的模块的正确方法吗?
我的下一个问题是...
我的SuperScreen.js结构应该是什么样的?
现在,它看起来像这样...

但显然这是行不通的。
对“bc”的引用位于构造函数中,因此自然不可用于placeAt函数调用。
我的边界容器应该在构造函数中还是在其他地方?
看起来声明函数允许继承。我很困惑,因为我不想从BorderContainer继承,我只想使用它。

zphenhs4

zphenhs41#

第一个问题:简短回答是肯定,
然后,要使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是一个静态变量,对构造函数和placeAt都是可见的。然后,它在SuperScreen的所有示例中共享,如果SuperScreen只被示例化一次,这也没有什么坏处。不过,你还是应该使用第二个解决方案,至少“以防万一”。如果你打算多次示例化SuperScreen,那么解决方案2是强制性的。其中每个SuperScreen示例有一个bc(一个不同的BorderContainer)。
这就是为什么在只需要一个示例的情况下,我更喜欢返回普通对象的模块,而不是类,因为我觉得它传递了正确的语义(一个示例化一次的类实际上不需要是一个类,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(...);
            ...
    }
});

要回答您的问题“您的BorderContainer应该在构造函数中还是在其他地方?":

  • yourSuperScreen是一个类,而不是一个小部件-declare(null, function(...){})-构造函数是你唯一的选择。有关声明和dojo类的更多细节,请参见dojo文档here
  • 如果它继承自dijit/_WidgetBase -declare(_WidgetBase, function(...){}),那么它将是一个小部件,在这种情况下,您将有一个选择,如dojo doc here中所述,postCreate()是一个常用方法(引用该文档,“到目前为止,要记住的最重要的方法......”);

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

z31licg0

z31licg02#

这里有一个很好的入门项目-https://github.com/denov/dojo-demo
HomePage.js非常接近您的SuperScreen.js

相关问题