2014-11-21 61 views
0

来自Java/C#我很努力去理解这对于我作为开发人员实际上意味着什么(我正在考虑太多面向对象)。Dojo模块加载一般

假设有使用相同的道场两个HTML文件模块通过要求()在脚本标签,像这样:)

<script type="text/javascript"> 
require(["some/module"],  
    function(someModule) {  
     ... 
    }    
); 
</script> 

我的理解是需要(加载所有给定的模块调用回调方法之前。但是,是否为每个require()定义了哪个模块?因此,在上面的示例中,某个/模块加载了一次,然后在两个HTML之间共享,或者加载了两次(即,在需求列表中列出的每个需求都加载了它)?

如果模块只加载一次,我可以在两个回调之间共享信息吗?如果它被加载两次,那么我如何在这两个回调之间共享信息呢?

官方文档中提到“全局函数定义允许您使用加载程序注册模块。”。这是否意味着定义类似于静态类/方法?

回答

4

如果您在同一个窗口中加载模块两次,它将只加载一次模块,并在第二次请求时返回相同的对象。

所以,如果你有两个独立的页面,那么它将有两个窗口,这意味着它将加载模块两次。如果您想共享信息,则必须将其存储在某处(Web无状态),您可以使用后端服务+数据库,也可以使用HTML5 localStorage API或IndexedDB(例如)。

如果你不想那样,你总是可以使用单页面应用程序。这意味着您将使用JavaScript(异步页面)在一个窗口中加载多个页面。


关于你的最后一个问题......用define()你定义模块。一个模块可以是一个简单的对象(因为您不必实例化,所以它类似于静态类),但是模块也可以是原型,这意味着您将能够创建实例,例如:

define([], function() { 
    return { 
    "foo": function() { 
     console.log("bar"); 
    } 
    }; 
}); 

这将在您每次需要时返回相同的单个对象。你可以看到它是一个静态类或单例。如果你需要两次,那么它会返回相同的对象。

然而,你也可以写这样的事:

define([], function() { 
    return function() { 
    this.foo = function() { 
     console.log("bar"); 
    }; 
    }; 
}); 

,这意味着你要返回一个原型。使用它需要你实例化,例如:

require(["my/Module"], function(Module) { 
    new Module().foo(); 
}); 

原型是JavaScript的一个基本特征,但在道场有,做,对你,叫dojo/_base/declare的模块。你经常会看到这样的事情:

define(["dojo/_base/declare"], function(declare) { 
    return declare([], { 
    foo: function() { 
     console.log("bar"); 
    } 
    }); 
}); 

在这种情况下,你将不得不同样加载它的原型(使用new关键字)。

你可以在Plunker上找到所有这些的演示。


也许你会问,你怎么能告诉一个单/静态类模块之间的差异,以及原型模块...好,有一个共同的命名约定吧。当您的模块以大写字母开头时(例如dijit/layout/ContentPanedojo/dnd/Moveable,...),那么它通常意味着该模块需要实例。当模块以小写字母开头时,它是一个静态类/单例(例如dojo/_base/declare,dijit/registry

1

1)dojo要求,加载模块一次,然后如果你再次调用require() will simply return if the package is already loaded.,所以请求将被调用一次,它也会调用任何依赖关系一次。

但是,如果您离开页面并在不同的页面中调用相同的模块,那么它们将在服务器中调用。您还可以在配置设置中使用缓存,以便将事件缓存在浏览器中,并且文件将与否通过将cacheBust设置为true(如果需要全新副本)或false(假如希望缓存内容)。 2)如果你在同一个html页面和域中,模块没有改变模块将是相同的,你可以共享值和任何改变,你可以从任何地方得到它,除非你调用一个新的实例。但是这在不同的html页面之间是不可能的。

3)不是它不像静态类或方法从我了解静态方法A static class can be used as a convenient container for sets of methods that just operate on input parameters and do not have to get or set any internal instance fields.。 道场的工作方式不同它是一个对象的引用,如果你那样做的:

define(function(){ 
    var privateValue = 0; 
    return { 
     increment: function(){ 
      privateValue++; 
     }, 

     decrement: function(){ 
      privateValue--; 
     }, 

     getValue: function(){ 
      return privateValue; 
     } 
    }; 
}); 

这意味着代码加载的每一位该模块将引用同一个对象在内存中,因此价值会通过相同不使用该模块。

当然,这是我的理解,请随时告诉我,我错了。