为什么dijit / registry的byId()方法“不存在”?

时间:2013-08-06 01:40:35

标签: dojo

我正在尝试使用digit/registry获取数字对象,以便我可以阅读/更改其属性。但由于某种原因,我得到一个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 documentation page(请参阅页面底部的示例...当您单击JSFiddle上的Run时,比较输出的第一行。)

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

3 个答案:

答案 0 :(得分:3)

看来(至少在你链接的小提琴中),你实际上从未通过调用parser.parse()来创建dijit。

parser.parse调用ready作为registry.byId()回调中的第一行,并从{{1}}获得了有效的dijit ID。

答案 1 :(得分:1)

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

  

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

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

  • 第一种情况是ID为“textNode3”的div不是实际的Dojo小部件,因此Dojo的注册表模块无法识别它。
  • 第二种情况是,当您向ID“myTextBox3”的输入提供data-dojo-type属性时,Dojo仍然没有实际解析任何标记。您将在reference guide for registry的最后一个示例中注意到,他们调用解析器模块来实际解释所提供的标记。

将此行添加到您的小提琴中,使该示例按预期工作。

答案 2 :(得分: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"); 
            },
        }
    }
}

与原始问题中的代码比较,看看差异。现在它有效。