我对Dojo的文档很困惑。如何在不实际使用dojo.declare()的情况下使用dojo.require()?我不想使用dojo.declare()的原因是它将声明的类公开为全局变量。
现在我的代码看起来像这样:
HTML file:
dojo.require('module.test');
Module/test.js:
dojo.provide('module.test');
function test() {
return 'found me';
}
我无法让Dojo在任何地方返回test()方法。在没有声明的情况下使用dojo.require()的正确模式是什么?
答案 0 :(得分:6)
我认为您将dojo.provide
/ dojo.require
与dojo.declare
混为一谈。它们是完全不同的概念。
dojo.provide
定义模块。
dojo.require
要求在稍后运行任何代码之前定义模块。
dojo.declare
完全不同。它声明了一个Dojo风格的类。
您可以在一个模块中拥有多个类,或者组成一个类的多个模块。一般来说,模块!==类,它们是完全不相关的概念。
答案 1 :(得分:2)
dojo.provide定义代码模块,以便加载器可以看到它,并通过该名称从全局命名空间创建一个对象。从那时起,您可以将代码直接锚定到该全局变量,例如
模块/ test.js:
dojo.provide('module.test');
module.test.myFunc = function() {
return 'found me';
}
您可以使用各种模式,例如创建闭包和隐藏“私有”函数实现,通过您在dojo.provide中创建的全局引用公开它们:
dojo.provide('module.test');
function(){
// closure to keep top-level definitions out of the global scope
var myString = 'found me';
function privateHelper() {
return myString;
}
module.test.myFunc = function() {
return privateHelper();
}
}();
请注意,上面简单地将方法直接放在对象上。现在,还有dojo.declare
,它经常与dojo.provide一起使用来创建一个带有原型和mixin的对象,这样你就可以创建带有一些继承的'new'关键字的实例,甚至可以模拟多个继承vai mixins。这种OO抽象经常被过度使用。它确实接近Java等语言所需的模式,因此有些人习惯于为所有事物声明对象。
请注意,从Dojo 1.5开始,dojo.declare
返回一个对象,并不一定需要在全局范围内声明任何内容。
答案 2 :(得分:1)
这是我有时使用的模式(这将是test.js的内容):
(function() {
var thisModule = dojo.provide("module.test");
dojo.mixin(thisModule, {
test: function() {
return "found me";
}
});
})();
现在,您可以在HTML页面中引用module.test.test()
。