dijit.registry.filter / dijit.registry.map 不会迭代,尽管 dijit.registry 充满了已注册的小部件?
Posted
技术标签:
【中文标题】dijit.registry.filter / dijit.registry.map 不会迭代,尽管 dijit.registry 充满了已注册的小部件?【英文标题】:dijit.registry.filter / dijit.registry.map won't iterate although dijit.registry is filled with registered widgets? 【发布时间】:2011-09-17 14:40:27 【问题描述】:我的 Dojo 应用程序包含几个小部件,它们都在 dijit.registry
(dijit.WidgetSet 的一个实例)中自动注册。我想使用filter()
(Link) 或map()
(Link) 方法将全局更改应用于由方法回调函数中定义的自定义属性模式过滤的某些小部件。
console.log(dijit.registry);
转储注册表,证明里面装满了小部件:
只是为了测试filter()
方法,我做了以下操作(与上面提到的console.log(dijit.registry);
完全相同):
var widgets = dijit.registry.filter(function(w, i)
return true;
);
console.log(widgets);
但我得到以下输出:
使用map()
方法时的类似行为:
var widgets = dijit.registry.map(function(w)
return w;
);
console.log(widgets);
...然后我得到一个空数组。
这是怎么回事,出了什么问题?
仅供参考:在回调函数中创建单个 console.log(w);
不会输出任何内容,甚至不会调用它们,这意味着 dijit.registry
甚至不会被这两个方法迭代。
console.log(dijit.registry._hash);
打印包含 12 个属性(小部件)的对象。 for(var w in dijit.registry._hash) /* ... */
根本不起作用 - 它神秘地没有跳入循环。
【问题讨论】:
【参考方案1】:dijit.registy.map
在我的机器上运行良好TM,(Firefox 6)。
您应该尝试制作一个重现此内容的具体示例。在最好的情况下,您会发现它是一个错字或类似的东西,而在最坏的情况下,我们会提交一个 Dojo 错误。
如果一切都失败了,也许您可以尝试直接侵入 dijit.registry._hash 对象,使用原版 for-in
循环进行迭代。 (我不知道这有多安全)
【讨论】:
console.log(dijit.registry.filter(function(w, i) return true; ));
也在为我返回所有注册的小部件(Chrome 13)。【参考方案2】:
sn-p
var widgets = dijit.registry.filter(function(w, i)
return true;
);
console.log(widgets);
没有在 dojo.addOnLoad(function() /* ... */ );
中调用,这导致案例创建的小部件尚未注册,无法通过 dijit.registry.filter()
进行迭代。
【讨论】:
除非您使用的是旧版本的道场,否则dojo.ready
是addOnLoad
的更性感别名【参考方案3】:
您的小部件是如何创建的?以编程方式?声明式的? dijit.byId('someId') 是否正确返回您的小部件? WidgetSet#filter 函数确实没有做任何特别的事情(1.6.1 源代码):
filter: function(/*Function*/ filter, /* Object? */thisObj)
// summary:
// Filter down this WidgetSet to a smaller new WidgetSet
// Works the same as `dojo.filter` and `dojo.NodeList.filter`
//
// filter:
// Callback function to test truthiness. Is passed the widget
// reference and the pseudo-index in the object.
//
// thisObj: Object?
// Option scope to use for the filter function.
//
// example:
// Arbitrary: select the odd widgets in this list
// | dijit.registry.filter(function(w, i)
// | return i % 2 == 0;
// | ).forEach(function(w) /* odd ones */ );
thisObj = thisObj || dojo.global;
var res = new dijit.WidgetSet(), i = 0, id;
for(id in this._hash)
var w = this._hash[id];
if(filter.call(thisObj, w, i++, this._hash))
res.add(w);
return res; // dijit.WidgetSet
,
【讨论】:
OP 已经发现了问题所在。他在创建小部件之前正在检查它们。 (而且我认为他接受自己的答案是有时间限制的):/ 哎呀,不知道我怎么错过了。以上是关于dijit.registry.filter / dijit.registry.map 不会迭代,尽管 dijit.registry 充满了已注册的小部件?的主要内容,如果未能解决你的问题,请参考以下文章