3

我正在尝试使用数字/注册表来获取数字对象,以便我可以读取/更改其属性。但由于某种原因,我收到一个 JavaScript 错误,即在下面的(修剪后的)代码中,注册表对象不存在“byId”方法:

define(["dojo/dom-style", "dijit/registry", [...] ],
        function(domStyle, registry, [...])
{
    var self =
    {
        moveSplitter: function(datasetsLength)
        {   
             var myBC = registry.byId("studiesBorderContainer");    
        },
    }
}

我似乎能够在 JSFiddle 中复制这个问题:

http://jsfiddle.net/rUNNr/2/

然而它可以在Dojo 文档页面上运行(请参阅页面底部的示例......比较您单击 Run 时的第一行输出与 JSFiddle 上的输出。)

我错过了什么?(注意:也有可能我没有为 dojo 示例正确设置 JSFiddle。)

4

3 回答 3

3

看来(至少在您链接到的小提琴中),您实际上从未通过调用parser.parse().

我将调用添加为回调parser.parse中的第一行,并从.readyregistry.byId()

于 2013-08-06T01:55:47.677 回答
1

registry.byId()文档提供了对此的见解:

...它仅适用于已解析的 dijit,无论是在标记中使用 data-dojo-type 属性声明还是以编程方式声明。相同的 id 属性用作参数,但在这种情况下返回的是一个对象,该对象是在解析标记并将其转换为 dijit 时由 dojo 小部件系统创建的。

所以在你的例子中,这种行为是有道理的:

  • 第一种情况是 ID 为“textNode3”的 div 不是实际的 Dojo 小部件,因此 Dojo 的注册表模块无法识别它。
  • 第二种情况是,虽然为 ID“myTextBox3”的输入提供了 data-dojo-type 属性,但 Dojo 仍然没有真正解析任何标记。您会在注册表参考指南的最后一个示例中注意到,它们调用解析器模块以实际解释提供的标记。

将此行添加到您的 Fiddle 使示例按预期工作。

于 2013-08-06T01:56:37.817 回答
1

其他几位发帖人发现我的 jsFiddle 有问题,但不是我原来问题的答案。我刚刚自己找到了答案,所以我分享一下,以防其他人有类似的问题。

最初的问题是 registry.byId() 调用返回“不存在方法”。答案是您(显然)无法从您的 define([...],function(...)] 块中访问“dijit/registry”,而是必须使用 require()。我以前没有了解 define() 和 require() 之间的区别,所以我阅读了这很有帮助:

http://dojotoolkit.org/documentation/tutorials/1.9/modules/

简而言之,define() 定义了一个模块,但您仍然可以在定义的模块使用 require() 块来访问某些显然需要它的东西。我仍然不完全理解这一点(即为什么“数字/注册表”在添加到定义块时不起作用),但无论出于何种原因,这解决了我的问题。所以我的代码现在看起来更像这样:

define(["dojo/dom-style", [...] ],
        function(domStyle, [...])
{
    var self =
    {
        moveSplitter: function(datasetsLength)
        {   
            require(["dijit/registry"],
            function(registry)
            {
                var myBC = registry.byId("studiesBorderContainer"); 
            },
        }
    }
}

与我原始问题中的代码进行比较以查看差异。现在它可以工作了。

于 2013-08-06T20:07:29.480 回答