在dojo模块中访问javascript变量
我正在用dojo创建一个模块。本模块是关于配置的在dojo模块中访问javascript变量,javascript,dojo,Javascript,Dojo,我正在用dojo创建一个模块。本模块是关于配置的 define(["geometry/Point"], function (Point) { var sp = new Point(122, -142); return { startPoint: new Point(122, -142), globalOptions: { logo: false,
define(["geometry/Point"], function (Point) {
var sp = new Point(122, -142);
return {
startPoint: new Point(122, -142),
globalOptions: {
logo: false,
center: sp
},
};
})
在本模块中,如果我使用sp变量作为中心,则代码正常工作。但是如果我使用中心作为起点,中心将为空。像下面
define(["geometry/Point"], function (Point) {
return {
startPoint: new Point(122, -142),
globalOptions: {
logo: false,
center: this.startPoint
},
};
})
我删除了变量sp,并使用了this.startPoint,但中心为空。这是因为引用了错误的对象。如果在
中心使用此
属性,则实际上不再引用模块。因为您正在实例化一个新对象,它实际上将引用全局对象,即(如果您使用浏览器)窗口
第一个解决方案之所以有效,是因为sp
的作用域是可以从模块以及globalOptions
属性访问的
编辑(根据评论要求):
要声明模块以访问其功能,应使用:
define([“dojo/\u base/declare”、“dojo/\u base/lang”、“dojo/\u base/array”]),函数(declare、lang、array){
返回declare(null{
参数:[“a”、“b”、“c”],
行动:功能(){
this.otherAction();//调用其他操作
},
其他操作:函数(){
array.forEach(this.param,lang.hitch(this,“lastFunction”);
},
lastFunction:函数(项,idx){
console.log(idx+“”+项);
}
});
});
这个例子展示了Dojo中的一些基础知识。要创建模块,应使用dojo/\u base/declare
。第一个参数null
用于定义继承模块的列表,在本例中为none
参数和函数可以用类似的方式声明。从另一个函数调用函数时,应提供上下文this
,例如this.otherAction()
如果您丢失了此
上下文,可以使用lang.hitch()
。它实际上调用函数,但保留上下文。这就是我对lang.hitch(这个“lastFunction”)所做的。
我可以解释得更多,但我认为阅读会很有用。那是因为你引用了错误的对象。如果在
中心使用此
属性,则实际上不再引用模块。因为您正在实例化一个新对象,它实际上将引用全局对象,即(如果您使用浏览器)窗口
第一个解决方案之所以有效,是因为sp
的作用域是可以从模块以及globalOptions
属性访问的
编辑(根据评论要求):
要声明模块以访问其功能,应使用:
define([“dojo/\u base/declare”、“dojo/\u base/lang”、“dojo/\u base/array”]),函数(declare、lang、array){
返回declare(null{
参数:[“a”、“b”、“c”],
行动:功能(){
this.otherAction();//调用其他操作
},
其他操作:函数(){
array.forEach(this.param,lang.hitch(this,“lastFunction”);
},
lastFunction:函数(项,idx){
console.log(idx+“”+项);
}
});
});
这个例子展示了Dojo中的一些基础知识。要创建模块,应使用dojo/\u base/declare
。第一个参数null
用于定义继承模块的列表,在本例中为none
参数和函数可以用类似的方式声明。从另一个函数调用函数时,应提供上下文this
,例如this.otherAction()
如果您丢失了此
上下文,可以使用lang.hitch()
。它实际上调用函数,但保留上下文。这就是我对lang.hitch(这个“lastFunction”)所做的。
我可以解释得更多,但我认为阅读会很有用。您的第一种方法是正确的,但是您有一点重复,这在
起点定义中是不需要的:
function test() {
var startPoint = "x,y"
return {
startPoint: startPoint,
globalOptions: {
logo: false,
center: startPoint
}
};
}
console.log(test().startPoint)
console.log(test().globalOptions)
在JSBIN中测试:您的第一种方法是正确的,但是您有一点重复,这在startPoint
定义中是不需要的:
function test() {
var startPoint = "x,y"
return {
startPoint: startPoint,
globalOptions: {
logo: false,
center: startPoint
}
};
}
console.log(test().startPoint)
console.log(test().globalOptions)
JSBIN中的测试:您是否正在尝试这样做
define(["geometry/Point"], function (Point) {
return {
startPoint: new Point(122, -142),
globalOptions: {},
postCreate: function () {
this.globalOptions = {
logo: false,
center: this.startPoint
}
}
};
})
发生此问题的原因是此
希望这对你有帮助。你想做这样的事吗
define(["geometry/Point"], function (Point) {
return {
startPoint: new Point(122, -142),
globalOptions: {},
postCreate: function () {
this.globalOptions = {
logo: false,
center: this.startPoint
}
}
};
})
发生此问题的原因是此
希望这将对您有所帮助。模块
这里需要注意的两个关键概念是define方法的思想,用于简化模块定义,以及require方法,用于处理依赖项加载。“定义”用于基于使用以下签名的提案定义命名或未命名模块:
define(
module_id /*optional*/,
[dependencies] /*optional*/,
definition function /*function for instantiating the module or object*/
);
从内联注释可以看出,module_id是一个可选参数,通常只有在使用非AMD连接工具时才需要它(在其他一些边缘情况下,它也很有用)。当忽略此参数时,我们将该模块称为匿名模块
在使用匿名模块时,模块标识的概念是枯燥的,这使得避免文件名和代码重复变得微不足道。由于代码更具可移植性,因此可以轻松地将其移动到其他位置(或文件系统周围),而无需更改代码本身或更改其ID。模块ID相当于简单软件包中的文件夹路径,并且不在软件包中使用。开发人员也可以在多个环境中运行相同的代码,只需使用AMD优化器,该优化器与r.js等公共js环境配合使用
回到define签名,dependencies参数表示您正在定义的模块和第三个参数('definition function')i所需的依赖项数组