有没有办法在dojo(1.8)模块中有一个静态变量,以便我可以保留状态?
示例,假设我在某些/ module
中设置了一些值require([
'some/module'
], function (module) {
module.setSomeValue(3);
});
..然后想要稍后检索
define([
'some/module'
], function(module) {
return {
start: function() {
var x = module.getSomeValue();
}
};
});
一种有效的解决方案,但似乎是一种黑客攻击,
acompany = window.acompany || {};
acompany.project = acompany.project || {
};
require([
], function() {
var debug = false;
acompany.project.module = {
/* static variables and functions here */
};
});
define([
], function () {
return acompany.project.module;
});
答案 0 :(得分:1)
实际上总是只有单个AMD模块实例,因为(source):
define还有两个可能不是很明显的重要特征:
- 模块创建是惰性和异步的,并且在调用define时不会立即发生。这意味着工厂没有执行,并且在某些正在运行的代码实际需要模块之前,模块的任何依赖关系都无法解决。
- 将模块值输入模块名称空间后,每次需要时都不会重新计算。在实际层面上,这意味着工厂仅被调用一次,并且返回的值被缓存并在使用给定模块的所有代码之间共享。 (注意:dojo加载器包含非标准函数require.undef,它取消定义模块值。)
此外,您不必只提供 factory 功能,您也可以提供对象文字:
define("some/module", {
someValue: "some",
otherValue: "other"
});
然后在代码中的其他地方:
require(["some/module"], function(module) {
console.log("module.someValue", module.someValue); // some
module.someValue = "some changed";
});
require(["some/module"], function(module) {
console.log("module.someValue", module.someValue); // some changed
});
更强大的解决方案包含dojo/Stateful
的实例,因此您可以watch
进行更改并定义custom setters and getters:
define("some/stateful-module", ["dojo/Stateful"], function(Stateful){
var stateful = new Stateful({
someValue: "some",
otherValue: "other"
});
return stateful;
});
然后在代码中的其他地方:
require(["some/stateful-module"], function(module) {
console.log("stateful-module.someValue:", module.get("someValue"));
module.watch(function(name, oldValue, newValue) {
console.log("stateful-module: property"
, name
, "changed from"
, "'" + oldValue + "'"
, "to"
, "'" + newValue + "'"
);
});
});
require(["some/stateful-module"], function(module) {
module.set("someValue", "some changed");
});
了解jsFiddle的工作原理:http://jsfiddle.net/phusick/fHvZf/。它位于单个文件中,但除非您require.undef(mid)
模块,否则它将在整个应用程序中以相同的方式工作。
答案 1 :(得分:0)
Dojo中有多个文件,如dojo/date/locale
,它们定义静态变量和函数,而不是使用dojo.declare
定义小部件/类。
定义模块
define([
'dojo/_base/lang/',
'some/module'
], function(lang, module) {
var m = lang.getObject('some.module', true);
m.x = 0;
m.doSomething = function(){
// doSomething
};
return m;
});
使用模块
require([
'some/module'
], function(someModule) {
var debug = false;
/* someModule - static variables and functions here */
if(someModule.x == 0){
}
});