2013-03-15 9 views
13

Mam prawdopodobnie nie tak wyjątkowy problem ze skomplikowaną aplikacją meteorów.Wykrywanie które reaktywne zapytanie zostało wywołane

Mam kilka czynności, które powodują odświeżanie części strony, które naprawdę nie są potrzebne. Ale mam problem ze zlokalizowaniem, która metoda find() (lub wiele find()) jest aktywowana. Znam kolekcję, o której mowa, po prostu nie której find().

Mogę używać obserwacjaChanges na każdym znalezisku używam, ale to byłoby dużo dodatkowego kodu.

Czy istnieje łatwy sposób sprawdzenia, co jest wyzwalane i przez co?

Dzięki!

Odpowiedz

19

Oto funkcja rejestrowania renderowania, która może okazać się przydatna. Loguje liczbę razy, gdy każdy szablon jest renderowany do konsoli. Wiesz, czy szablon jest ponownie renderowany po wczytaniu strony początkowej, ponieważ zmieniło się reaktywne źródło danych, na którym się opiera. Do tego reaktywnego źródła danych można było uzyskać dostęp za pomocą metody pomocniczej lub szablon jest elementem listy (tj. Wewnątrz bloku pomocniczego {{#each ...}}), a element listy został dodany, przeniesiony, usunięty lub zmieniony. Należy również pamiętać, że szablony podrzędne wywołują wywołanie zwrotne swojego rodzica, gdy dziecko jest renderowane lub ponownie renderowane. Więc może to wprowadzać w zakłopotanie myślenie, że rodzic został usunięty z DOM i cofnięty, ale to nie jest prawda.

Tak, można wywołać tę funkcję na końcu kodu klienta, aby zobaczyć liczbę render:

function logRenders() { 
    _.each(Template, function (template, name) { 
     var oldRender = template.rendered; 
     var counter = 0; 

     template.rendered = function() { 
     console.log(name, "render count: ", ++counter); 
     oldRender && oldRender.apply(this, arguments); 
     }; 
    }); 
    } 

EDIT: Oto sposób, aby owinąć kursor find zapisywać wszystkie zmiany do kursor do konsoli. Właśnie napisałem podobną funkcję do tego dla nowego pakietu, nad którym pracuję, nazywanego reaktywną wizją. Mam nadzieję, że wkrótce zostanie wydany.

var wrappedFind = Meteor.Collection.prototype.find; 

Meteor.Collection.prototype.find = function() { 
    var cursor = wrappedFind.apply(this, arguments); 
    var collectionName = this._name; 

    cursor.observeChanges({ 
    added: function (id, fields) { 
     console.log(collectionName, 'added', id, fields); 
    }, 

    changed: function (id, fields) { 
     console.log(collectionName, 'changed', id, fields); 
    }, 

    movedBefore: function (id, before) { 
     console.log(collectionName, 'movedBefore', id, before); 
    }, 

    removed: function (id) { 
     console.log(collectionName, 'removed', id); 
    } 
    }); 

    return cursor; 
}; 
+0

Cool, to jest bardzo pomocne. Czy istnieje sposób sprawdzenia, który helper lub element listy rzeczywiście wygenerował przebudowę szablonu? – Ricochet

+0

Myślę, że moje ogólne pytanie może być, czy istnieje sposób, aby włączyć coś takiego jak obserwujChanges na całym świecie? bez konieczności konfigurowania go w każdym znalezisku. – Ricochet

+0

Musiałbym wymyślić sposób na zrobienie tego. Musiałbyś stać się kreatywny. – cmather

0

Dziękuję za pomysł @cmather.

Meteor 1.3 Her jest dostosowany i bardziej zaawansowana wersja logRenders

// Log all rendered templates 
// If filter is set, only templates in filter will be logged 
// @params filter - name or names of template to filter 
logRenders = function logRenders (filter) { 
    for (name in Object(Template)){ 
    if (filter && !Array.isArray(filter)) filter = [filter]; 
    var template = Template[name]; 
    if (!template) continue; 
    if (filter && filter.indexOf(name) == -1){ 
     // Clear previous logRenders 
     if ('oldRender' in template) template.rendered = template.oldRender; 
     delete template.oldRender; 
     continue; 
    } 
    var t = function(name, template){ 
     if (!('oldRender' in template)) template.oldRender = template.rendered; 
     var counter = 0; 
     template.rendered = function() { 
     console.log(name, ++counter, this); 
     this.oldRender && this.oldRender.apply(this, arguments); 
     }; 
    }(name, template); 
    }; 
}; 
Powiązane problemy