0

有没有办法在 dojo (1.8) 模块中有一个静态变量,以便我可以保留状态?

例如,假设我在 some/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;
});
4

2 回答 2

1

实际上总是只有一个 AMD 模块实例,因为(来源):

define 有两个额外的重要特征,可能不是很明显:

  • 模块创建是惰性和异步的,并且在调用 define 时不会立即发生。这意味着工厂不会被执行,并且模块的任何依赖关系都不会被解析,直到某些正在运行的代码实际需要该模块。
  • 一旦模块值被输入到模块命名空间中,它就不会在每次被要求时重新计算。在实际层面上,这意味着factory 只被调用一次,并且返回的值被缓存并在使用给定模块的所有代码之间共享。(注意:dojo 加载器包含非标准函数 require.undef,它取消定义模块值。)

此外,您不必只提供工厂函数,还可以提供对象字面量:

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进行更改并定义自定义settergetter

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)它在那里的单个文件中,但除非您使用模块,否则它将在整个应用程序中以相同的方式工作。

于 2012-10-08T18:56:26.463 回答
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){

    }
});
于 2012-10-08T18:07:04.390 回答