私のアプリケーションにある種のアイテムのリストがあり、ユーザーがリストに新しいアイテムを挿入できるとします。
Meteorが通常行うことは、ユーザーがリストにアイテムを挿入すると、サーバーの確認を待たずに、すぐにブラウザーに表示されることです。
私が欲しいのは、アイテムがこの状態にあるとき(送信されたがサーバーによってまだ確認されていないとき)、リスト内の正しい位置に表示されますが、グレー表示されます。
Meteorにこれを行わせる方法はありますか?
私のアプリケーションにある種のアイテムのリストがあり、ユーザーがリストに新しいアイテムを挿入できるとします。
Meteorが通常行うことは、ユーザーがリストにアイテムを挿入すると、サーバーの確認を待たずに、すぐにブラウザーに表示されることです。
私が欲しいのは、アイテムがこの状態にあるとき(送信されたがサーバーによってまだ確認されていないとき)、リスト内の正しい位置に表示されますが、グレー表示されます。
Meteorにこれを行わせる方法はありますか?
もちろん。挿入を行うメソッドを作成します。メソッドを実行するときに、シミュレーションで実行されているかどうかを確認し、実行されている場合は、挿入されたアイテムに「一時的」または「未確認」フラグを設定します。これを使用して、アイテムをグレー表示にするかどうかを決定します。
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});
}
});
メソッドの呼び出し:
Meteor.call("add_item", "my item name");
それがあなたがする必要があるすべてです。これが機能する理由は、サーバーがアイテムの保存を完了すると、クライアントでのローカル(シミュレートされた)変更がバックアウトされ、サーバーで実際に発生したもの(「未確認」フラグは含まれません)に置き換えられるためです。
上記はそれを行う最も簡単な方法ですが、データベース内のすべてのレコードが「確認済み」のtrueの属性を持つことになります。これを回避するには、falseの場合にのみ確認済み属性を設定します。
isSimulation
およびの詳細については、ドキュメントのこの部分を参照してください。Meteor.methods
これは私がサーバー側にオブザーバーを追加したものです。サーバーが更新を受信すると、通知をtrueにし、クライアントが同じように更新されると、クライアント側からnotifyfalseという変数を作成しました。
Collection.find({"notify":false}).observe({
"added" : function(first){
collection.update({"_id":first._id},{$set : {"notify":true}});
}
});