什么是 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,而不是继承它。
好的,所以我想我可以更好地表达我想要完成的目标。
为了节省时间和代码编写,我想创建一个 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,而不是继承它。