我正在尝试使用digit/registry获取数字对象,以便我可以阅读/更改其属性。但由于某种原因,我得到一个JavaScript错误,下面的(修剪)代码中的注册表对象不存在“byId”方法:
define(["dojo/dom-style", "dijit/registry", [...] ],
function(domStyle, registry, [...])
{
var self =
{
moveSplitter: function(datasetsLength)
{
var myBC = registry.byId("studiesBorderContainer");
},
}
}
我似乎能够在JSFiddle中复制这个问题:
然而它适用于Dojo documentation page(请参阅页面底部的示例...当您单击JSFiddle上的Run时,比较输出的第一行。)
我错过了什么? (注意:我也没有为dojo示例正确设置JSFiddle。)
答案 0 :(得分:3)
看来(至少在你链接的小提琴中),你实际上从未通过调用parser.parse()
来创建dijit。
我parser.parse
调用ready
作为registry.byId()
回调中的第一行,并从{{1}}获得了有效的dijit ID。
答案 1 :(得分:1)
registry.byId()
文档提供了对此的见解:
...它仅适用于使用data-dojo-type属性或以编程方式在标记中声明的已解析dijit。相同的id属性用作参数,但在这种情况下返回的是在解析标记并转换为dijit时由dojo小部件系统创建的对象。
所以在你的例子中,这种行为是有道理的:
将此行添加到您的小提琴中,使该示例按预期工作。
答案 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");
},
}
}
}
与原始问题中的代码比较,看看差异。现在它有效。