保留dojo模块的一个实例

时间:2012-10-08 17:38:56

标签: dojo

有没有办法在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;
});

2 个答案:

答案 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){

    }
});