2012-04-10 10 views
31

Powiedz, że moja aplikacja zawiera listę elementów, a użytkownicy mogą wstawiać nowe pozycje na liście.W Meteororze, jak wyświetlić nowo wstawione dane jako wyszarzone, dopóki nie zostanie potwierdzone przez serwer?

To, co Meteor zwykle robi, to: kiedy użytkownik wstawia przedmiot na listę, natychmiast pojawia się w jego przeglądarce, nie czekając na potwierdzenie serwera.

Potrzebuję: gdy przedmiot jest w tym stanie (przesłany, ale jeszcze nie potwierdzony przez serwer), pojawia się na właściwej pozycji na liście, ale jest wyszarzony.

Czy istnieje sposób, aby Meteoror to zrobił?

Odpowiedz

38

Pewnie. Utwórz metodę, która wykonuje wstawienie. Po uruchomieniu metody sprawdź, czy działa w symulacji, a jeśli tak, ustaw flagę tymczasową lub niepotwierdzoną na wstawionym elemencie. Użyj go, aby zdecydować, czy chcesz, aby element był wyszarzony.

Zakładając, że używasz MongoDB:

// Put this in a file that will be loaded on both the client and server 
Meteor.methods({ 
    add_item: function (name) { 
    Items.insert({name: name, 
        confirmed: !this.isSimulation}); 
    } 
}); 

Wywołanie metody:

Meteor.call("add_item", "my item name"); 

To wszystko, co trzeba zrobić. Powodem tego jest to, że gdy serwer zakończy zapisywanie elementu, lokalne (symulowane) zmiany na kliencie zostaną wycofane i zastąpione tym, co faktycznie wydarzyło się na serwerze (które nie będzie zawierało flagi "Niepotwierdzone").

Powyższe jest najprostszym sposobem, aby to zrobić, ale spowoduje to, że wszystkie zapisy z bazy danych o "potwierdzonej" wartości true będą w bazie danych. Aby tego uniknąć, ustaw potwierdzony atrybut tylko, jeśli jest fałszywy.

Patrz tej części dokumentacji, aby uzyskać więcej informacji o isSimulation i Meteor.methods

+1

Czy to ma znaczenie, jeśli użyłem Meteor.isClient zamiast this.isSimulation tutaj? –

+0

[This SO answer] (http://stackoverflow.com/a/27315009/302898) odnosi się do różnicy między 'isClient' i' isSimulation'. Krótka odpowiedź: powinieneś użyć "isSimulation" tutaj. – Sean

1

To co zrobiłem dodany obserwatora po stronie serwera, stworzyłem zmienna nazywa powiadamiania fałszywe od strony klienta samego jednokrotnie serwer odbiera polecenie udpate, które spowoduje, że powiadomi prawdę, a klient zostanie zaktualizowany na tym samym.

Collection.find({"notify":false}).observe({ 
    "added" : function(first){ 
     collection.update({"_id":first._id},{$set : {"notify":true}}); 
    } 
}); 
Powiązane problemy