3

我创建了一个依赖于 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) {
...

认为这可能有效。

我可以看到 JsonRestStore.js.uncompressed.js 文件正在 FireBug 中加载,但尝试执行此操作时出现错误new JsonRestStore

JsonRestStore is not a constructor

这应该工作吗?

有没有办法将 Dojo 配置为使用所有模块的未压缩版本?这就是我真正想要的,但如果这是唯一的方法,我会满足于每个依赖项。

更新

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

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

4

2 回答 2

2

你有两个选择

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

或者

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

对于我从事的项目,我两者都做。我设置了 Dojo 配置,使其可以是动态的,并且我可以使用查询字符串参数更改我想要的配置。

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

我对此进行了更多描述

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

于 2012-06-14T13:55:10.333 回答
1

我认为这是因为加载器通过使用的文件约定声明了它的类加载(模块)。1.7 加载器还不是很健壮,在意识到如何分离 '.' 之前我遇到了类似的问题。和 '/' 字符。

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

'define(/ * BLANK * / [ / * DEPENDENCIES * / ], ...)' - 没有给出第一个字符串参数 - 由文件名(基本名)加载。不过,返回的声明也有一个说法。因此,对于您使用 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. 我认为将define([], function(){})in uncompressed.js 修改为define("JsonRestStore", [], function() {})可以解决问题(未确认)
  3. 使用 dojo/text loader,见下文

需要文字填充物:)

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...
于 2012-06-14T00:34:17.323 回答