我正在用dojo创建一个模块。该模块是关于配置的。
define(["geometry/Point"], function (Point) {
var sp = new Point(122, -142);
return {
startPoint: new Point(122, -142),
globalOptions: {
logo: false,
center: sp
},
};
})
在此模块中,如果我使用 sp varible作为中心,代码正在运行。但是如果我使用中心作为起点,那么中心就会变为空。喜欢以下
define(["geometry/Point"], function (Point) {
return {
startPoint: new Point(122, -142),
globalOptions: {
logo: false,
center: this.startPoint
},
};
})
我删除了变量 sp 并使用了 this.startPoint ,但是中心变为空。
答案 0 :(得分:2)
那是因为你引用了错误的对象。如果您在this
媒体资源上使用center
,则实际上您不再参考您的模块。因为您要实例化一个新对象,它实际上会引用全局对象,即(如果您使用的是浏览器)window
。
您的第一个解决方案有效,因为sp
具有范围,因此可以从您的模块以及globalOptions
属性访问它。
编辑(根据评论的要求):
要声明模块以访问其功能,您应该使用:
define(["dojo/_base/declare", "dojo/_base/lang", "dojo/_base/array"], function(declare, lang, array) {
return declare(null, {
param: ["a", "b", "c"],
action: function() {
this.otherAction(); // Call other action
},
otherAction: function() {
array.forEach(this.param, lang.hitch(this, "lastFunction"));
},
lastFunction: function(item, idx) {
console.log(idx + " " + item);
}
});
});
此示例显示了Dojo中的一些基础知识。要创建模块,您应该使用dojo/_base/declare
。第一个参数null
用于定义继承模块的列表,在本例中为none。
可以以类似的方式声明参数和函数。从另一个函数调用函数应该通过提供上下文this
来完成,例如this.otherAction()
。
如果您丢失this
上下文,则可以使用lang.hitch()
。它实际上调用了函数,但保留了上下文。这就是我对lang.hitch(this, "lastFunction")
的所作所为。
我可以解释得更多,但我认为阅读this tutorial会很有用。
答案 1 :(得分:1)
你是不是想做这样的事情,
define(["geometry/Point"], function (Point) {
return {
startPoint: new Point(122, -142),
globalOptions: {},
postCreate: function () {
this.globalOptions = {
logo: false,
center: this.startPoint
}
}
};
})
因为这个问题的范围而发生此问题。
希望这会对你有帮助..
答案 2 :(得分:1)
<强>模块强>
这里需要注意的两个关键概念是用于促进模块定义的 define 方法和用于处理依赖性加载的 require 方法。 define用于根据提议使用以下签名定义命名或未命名的模块:
define(
module_id /*optional*/,
[dependencies] /*optional*/,
definition function /*function for instantiating the module or object*/
);
正如您可以通过内联注释看到的那样,module_id是一个可选参数,通常仅在使用非AMD连接工具时才需要(可能还有一些其他边缘情况也很有用)。如果遗漏这个论点,我们会匿名调用该模块。
使用匿名模块时,模块标识的概念是DRY,这使得避免重复文件名和代码变得微不足道。由于代码更具可移植性,因此可以轻松地将其移动到其他位置(或文件系统周围),而无需更改代码本身或更改其ID。 module_id等同于简单包中的文件夹路径以及未在包中使用时。开发人员也可以通过使用适用于CommonJS环境(如r.js)的AMD优化器在多个环境中运行相同的代码。
返回定义签名,dependencies参数表示您定义的模块所需的依赖关系数组,第三个参数('定义函数')是为实例化模块而执行的函数。准系统模块可以定义如下:
// A module_id (myModule) is used here for demonstration purposes only
define('myModule',
['foo', 'bar'],
// module definition function
// dependencies (foo and bar) are mapped to function parameters
function ( foo, bar ) {
// return a value that defines the module export
// (i.e the functionality we want to expose for consumption)
// create your module here
var myModule = {
doStuff:function(){
console.log('Yay! Stuff');
}
}
return myModule;
});
// An alternative example could be..
define('myModule',
['math', 'graph'],
function ( math, graph ) {
// Note that this is a slightly different pattern
// With AMD, it's possible to define modules in a few
// different ways due as it's relatively flexible with
// certain aspects of the syntax
return {
plot: function(x, y){
return graph.drawPie(math.randomGrid(x,y));
}
}
};
});
另一方面,如果您希望动态获取依赖项,require 通常用于在顶级JavaScript文件或模块内加载代码。
// Consider 'foo' and 'bar' are two external modules
// In this example, the 'exports' from the two modules loaded are passed as
// function arguments to the callback (foo and bar)
// so that they can similarly be accessed
require(['foo', 'bar'], function ( foo, bar ) {
// rest of your code here
foo.doSomething();
});
希望这对你有帮助......
答案 3 :(得分:0)
您的第一种方法是正确的,但您在startPoint
定义中有一些不需要的重复:
function test() {
var startPoint = "x,y"
return {
startPoint: startPoint,
globalOptions: {
logo: false,
center: startPoint
}
};
}
console.log(test().startPoint)
console.log(test().globalOptions)
在JSBIN中测试:http://jsbin.com/IxENEkA/1/edit