如何在Dojo 1.7中使用未压缩的文件?

时间:2012-06-13 17:32:11

标签: javascript dojo js-amd

我创建了一个依赖于dojox / data / JsonRestStore的Dojo模块,如下所示:

define("my/MyRestStore", 
    ["dojo/_base/declare", "dojox/data/JsonRestStore"], 
    function(declare, JsonRestStore) {

var x = new JsonRestStore({
    target: '/items',
    identifier: 'id'
});

...

哪个好。但现在我想加载JsonRestStore代码的未压缩版本,以便我可以调试它。我找不到任何关于如何执行此操作的文档,但由于有一个名为'JsonRestStore.js.uncompressed.js'的文件,我将代码更改为:

define("my/MyRestStore", 
    ["dojo/_base/declare", "dojox/data/JsonRestStore.js.uncompressed"], 
    function(declare, JsonRestStore) {
...
认为这可行。

我可以看到在FireBug中加载了JsonRestStore.js.uncompressed.js文件,但在尝试执行new JsonRestStore时收到错误:

JsonRestStore is not a constructor

这应该有用吗?

有没有办法配置Dojo以使用所有模块的未压缩版本?这就是我真正想要的,但是如果这是唯一的方法,那么我会在每个依赖的基础上做到这一点。

更新

我找到了实现我想要做的方法:将JsonRestStore.js.uncompressed.js文件重命名为JsonRestStore.js。

然而,这看起来有点像一个hacky解决方法,所以我仍然想知道是否有更好的方法(例如通过配置)。

2 个答案:

答案 0 :(得分:2)

您有两个选择

1)创建自定义构建。自定义生成将输出一个可用于调试的未压缩文件。想想dojo.js.uncompressed.js,但它包含了你使用的所有额外模块。

OR

2)对于开发环境,请使用dojo源代码。这意味着从开发环境中下载Dojo Toolkit SDK并引用dojo.js。

对于我所从事的项目,我同时做了两件事。我设置了Dojo配置,以便它可以是动态的,我可以使用查询字符串参数更改我想要的配置。

当我调试问题时,我将使用第一个选项让我逐步执行代码并查看发生了什么。当我编写一些重要的j并且不希望自定义构建的开销看到我的更改时,我使用第二个选项。

我在

更多地描述了这一点

http://swingingcode.blogspot.com/2012/03/dojo-configurations.html

答案 1 :(得分:1)

我认为这是因为加载器通过使用的文件约定声明了它的类加载(模块)。 1.7加载器还没有太强大,我已经遇到了类似的问题,直到意识到如何分离'。'和'/'字符。

它只是一个合格的猜测;但我相信它与“。”的解释有关。类名中的字符,表示子命名空间而不是模块名称。

'define(/ * BLANK * / [/ * DEPENDENCIES * /],...)' - 其中没有给出第一个字符串参数 - 由文件名(basename)加载。返回的声明也有一个说法。因此,对于jsonrest的示例,它的拆分/解析如下:

toplevel = dojox
mid = data
modulename = JsonRestStore.js.uncompressed

(失败..模块呈现为dojox.data.JsonRestStore.js.uncompressed,而不是dojox.data.JsonRestStore应该如此)。

所以,有三个选择;

  1. 通过<script src="{{dataUrl}}/dojox/data/JsonRestStore.js.uncompressed.js"></script>加载未注释的类,并在dojo.ready
  2. 上处理它们
  3. 我认为将uncompressed.js中的define([], function(){})修改为define("JsonRestStore", [], function() {})可以解决问题(未经确认)
  4. 使用dojo /文本加载器,见下文
  5. 需要文字填充:)

    define("my/MyRestStore", 
        ["dojo/_base/declare", "dojo/text!dojox/data/JsonRestStore.js.uncompressed.js"], 
        function(declare, JsonRestStore) {
    ...
            JsonRestStore = eval(JsonRestStore);
            // not 100% sure 'define' returns reference to actual class, 
            // if above renders invalid, try access through global reference, such as
            // dojox.dat...