最初に、いくつかの背景
私のクライアントには一種の「分割ビュー」があります。つまり、オブジェクトのリストを表示するサイドパネルと、選択したオブジェクトの詳細を表示するメインビューです。ユーザーがリスト内のオブジェクトをクリックするたびに、バックボーンのルートが呼び出されて ID に移動し、それによってSessionの「選択された」プロパティが更新されます。これにより、メイン ビューが更新されます。かなり標準的なものです。
問題
クライアントの応答性を可能な限り高めたいので、Meteor の機能を利用して、サーバーの確認を待たずにすぐにクライアントを更新しようとしています。
私の目標は、オブジェクトが作成されるたびに、リストとメイン ビューが即座に更新され、新しく追加されたオブジェクトが反映されるようにすることです。これを実現するために、Collection.insert を使用して ID を返すMeteor.method create()を作成し、Route で使用できるようにしました。メソッドはクライアントとサーバー間で共有され、テンプレートのイベント ハンドラー内から呼び出されます。
私の最初の試みは、返された ID をイベント ハンドラーの変数に格納し、次の行でRouteを更新することでした。メソッドが未定義の値を返したため、何らかの理由でそれが機能しませんでした。そこで、ID を返す代わりに別のアプローチを試してみました。メソッド内でそれを使用してRouteを直接更新しました (もちろん Meteor.isClient の場合)。クライアントのバージョンのメソッドで Collection.insert によって返された id がサーバーのバージョンのものと異なるため、これも機能しませんでした。
最初のアプローチ
Template.createDialog.events({
'click #btn-dialog-create': function (event, template) {
var objectId = Meteor.call('create');
appRouter.navigate("object/id/" + objectId, {trigger:true});
}
});
2 番目のアプローチ
Meteor.methods({
create: function () {
var ObjectId = Objects.insert({name:'test'});
if(Meteor.isClient){
appRouter.navigate("object/id/" + objectId, {trigger:true});
}
}
});
誰かが何が起こっているかを知っていて、私にいくつかの指示を与えることができれば、それは素晴らしいことです. 問題または提案に対するさまざまなアプローチも大歓迎です。
ありがとう
アップデート
そこで、@Pent の提案を試してみたところ、2 番目のアプローチと同じ結果が得られました。奇妙な理由で、Meteor は私の ID ( Random.id()で作成されたもの) を無視することを決定し、別の ID でオブジェクトを挿入します。
だから私は別のアプローチを試しました.Random.id()と出来上がりの代わりに単純な文字列値を使用しました-それはうまくいきました. 私にそれをなぞってください。