1

最初に、いくつかの背景

私のクライアントには一種の「分割ビュー」があります。つまり、オブジェクトのリストを表示するサイドパネルと、選択したオブジェクトの詳細を表示するメインビューです。ユーザーがリスト内のオブジェクトをクリックするたびに、バックボーンのルートが呼び出されて 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()と出来上がりの代わりに単純な文字列値を使用しました-それはうまくいきました. 私にそれをなぞってください。

4

3 に答える 3

1

回答が更新されました:

これは、クライアントとサーバーの両方のメソッドになります。

Meteor.methods({
    create: function () {
        var id = Random.id();
        Objects.insert({_id: id, name:'test'});
        if(this.isSimulation) {
            appRouter.navigate("object/id/" + id, {trigger:true});
        }
    }
});

Meteor のパーティーの例から同様のパターンを表示できます: https://github.com/meteor/meteor/blob/b28c81724101f84547c6c6b9c203353f2e05fbb7/examples/parties/model.js#L56

于 2013-10-28T20:59:46.523 に答える
0

あなたの問題は、リモートメソッド、つまりサーバー上で呼び出されるメソッドが単純に値を返さないという事実によって引き起こされます。代わりに、返された値を処理するために使用されるコールバックを受け入れます ( docsを参照)。したがって、最初の例では、おそらく次のようにする必要があります。

Template.createDialog.events({
    'click #btn-dialog-create': function (event, template) {
        Meteor.call('create', function (error, result) {
            if (!error)
                appRouter.navigate("object/id/" + result, {trigger:true});
        });
    }
});

あなたはまた言った:

クライアントの応答性を可能な限り高めたいので、Meteor の機能を利用して、サーバーの確認を待たずにすぐにクライアントを更新しようとしています。

この場合、サーバーの応答を待つ必要があると思います。idサーバーから提供されない限り、正しいオブジェクトを取得する可能性はないことに注意してください。

この問題を回避する方法の 1 つは、ローカル (クライアント側) コレクションを作成することです。

// only on client
var temporary = new Meteor.Collection(null); // null name

「一時的な」新しく作成されたオブジェクトを保存し、ユーザーがsaveボタンをクリックした後に「実際の」コレクションに保存できます。object/new/*データベースに保存される前に、これらのオブジェクトにアクセスするなどのURL に応答するようにルーターを実装できます。

于 2013-10-29T09:06:35.990 に答える