2015-01-14 10 views
10

Czy możliwe jest opublikowanie tylko liczby dla kolekcji dla użytkownika? Chcę wyświetlić całkowitą liczbę na stronie głównej, ale nie przekazać wszystkich danych użytkownikowi. Oto, co próbowałem, ale to nie działa:Meteor - Opublikuj tylko liczbę do kolekcji

Meteor.publish('task-count', function() { 
    return Tasks.find().count(); 
}); 

this.route('home', { 
    path: '/', 
    waitOn: function() { 
     return Meteor.subscribe('task-count'); 
    } 
}); 

Kiedy próbuję tego, otrzymuję niekończącą się animację ładowania.

+0

jest tych 'Tasks' należą do użytkowników lub cokolwiek? Dlaczego pytam o to, że możesz utrzymać tę liczbę wewnątrz kolekcji 'users' i tam ją pobrać – ajduke

Odpowiedz

16

Meteor.publish funkcje powinny powrócić kursory, ale tu wracasz bezpośrednio do Number która jest całkowita liczba dokumentów w kolekcji Tasks.

Zliczanie dokumentów w Meteor jest zaskakująco trudniejszym zadaniem, niż się wydaje, jeśli chcesz zrobić to we właściwy sposób: używając rozwiązania eleganckiego i skutecznego.

Pakiet ros:publish-counts (rozwidlenie tmeasday:publish-counts) zapewnia dokładne liczby dla małych zbiorów (100-1000) lub „prawie” dokładnych liczy większych zbiorów (dziesiątki tysięcy) za pomocą opcji fastCount.

można użyć go w ten sposób:

// server-side publish (small collection) 
Meteor.publish("tasks-count",function(){ 
    Counts.publish(this,"tasks-count",Tasks.find()); 
}); 

// server-side publish (large collection) 
Meteor.publish("tasks-count",function(){ 
    Counts.publish(this,"tasks-count",Tasks.find(), {fastCount: true}); 
}); 

// client-side use 
Template.myTemplate.helpers({ 
    tasksCount:function(){ 
    return Counts.get("tasks-count"); 
    } 
}); 

dostaniesz po stronie klienta reaktywny liczyć, jak również po stronie serwera rozsądnie wydajnych realizacji.

Ten problem jest omawiany w (płatne) kuloodporne Meteor lekcji, która jest zalecana literatura: https://bulletproofmeteor.com/

6

chciałbym użyć Meteor.call

Klient:

var count; /// Global Client Variable 

Meteor.startup(function() { 
    Meteor.call("count", function (error, result) { 
     count = result; 
    }) 
}); 

zwrot count w jakiś pomocnik

Serwer:

Meteor.methods({ 
    count: function() { 
    return Tasks.find().count(); 
    } 
}) 

* Uwaga to rozwiązanie nie byłoby reaktywne. Jednakże, jeśli pożądana jest reaktywność, można ją włączyć.

Powiązane problemy