dijit.registry.filter / dijit.registry.map не будет повторяться, хотя dijit.registry заполнен зарегистрированными виджетами? - PullRequest
1 голос
/ 17 сентября 2011

Приложение My Dojo содержит несколько виджетов, которые все автоматически регистрируются в dijit.registry (экземпляр dijit.WidgetSet ). Я хотел бы использовать метод filter() ( Link ) или map() ( Link ) для применения глобальных изменений к определенным виджетам, отфильтрованным по шаблону пользовательского свойства, определенному в функции обратного вызова методов.

Сброс реестра с помощью console.log(dijit.registry); доказывает, что он заполнен виджетами:

console.log(dijit.registry);

Просто для проверки метода filter() я сделал следующее (точно в том же объеме, что и вышеупомянутый console.log(dijit.registry);):

var widgets = dijit.registry.filter(function(w, i) {
    return true;
});

console.log(widgets);

Но я получил следующий вывод:

enter image description here

Аналогичное поведение при использовании метода 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) { /* ... */ } вообще не работает - он загадочным образом не запрыгивает в петлю.

Ответы [ 3 ]

1 голос
/ 18 сентября 2011

Фрагмент

var widgets = dijit.registry.filter(function(w, i) {
    return true;
});

console.log(widgets);

не вызывался внутри dojo.addOnLoad(function() { /* ... */ });, что привело к тому, что созданные виджеты еще не были зарегистрированы и не могли быть повторены через dijit.registry.filter().

1 голос
/ 19 сентября 2011

Как создаются ваши виджеты?Программный?Декларативны?Правильно ли dijit.byId ('someId) возвращает ваши виджеты?Функция фильтра WidgetSet # действительно ничего особенного не делает (источник 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
},
1 голос
/ 18 сентября 2011

dijit.registy.map отлично работает на моей машине TM , (Firefox 6).

Вы должны попробовать создать конкретный пример, воспроизводящий это.В лучшем случае вы обнаружите опечатку или что-то в этом роде, а в худшем случае мы сообщим об ошибке Dojo.


Если ничего не помогает, возможно, вы можете попробовать взломать непосредственно объект dijit.registry._hash, повторив цикл ванили for-in.(Хотя я понятия не имею, насколько это безопасно)

...