1

現在、Ember アプリで FixtureAdapter を使用していますが、RESTAdapter に切り替えると、URL が機能しなくなります。

このアプリはスコアキーピング タイプのものであり、ユーザーが Web に接続しなくてもすべてのスコアを記録できるようにしたいと考えています。ゲームが終了したら、必要に応じてすべてのデータをサーバーに保存できます。

ここで、Ember が「matches/:match_id」にルーティングしようとすると、サーバー/ストアに何もコミットしていないため ID が存在しないため、モデルにはまだ ID がなく、次のような URL が取得されます。 /マッチ/ヌル/ゲーム/ヌル

これは予想される動作ですか?もしそうなら、回避策はありますか?model.clientId を使用し、各ルートのモデル フックをオーバーライドして、存在する場合は ID を使用してストアからモデルを取得し、clientId にフォールバックすることを考えました。他のアイデアはありますか?

2013 年 3 月 10 日更新:

以下は私のニーズに合っているようで、(今のところ) ローカル ストレージと REST アダプターの間を行き来することを忘れることができます。

App.Store = DS.Store.extend({
  revision: 11,
  adapter: DS.RESTAdapter.extend({
    namespace: 'api/v1',
    bulkCommit: true,
    generateIdForRecord: function(store, record) {
      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
      });
    }
  })
});

から取得した UUID 関数: JavaScript で GUID / UUID を作成しますか?

4

1 に答える 1

2

レコードがコミットされていない場合、まだコミットされていないはずidです。さらに、そのレコードを表示するアプリケーションの状態をシリアル化する URL は意味がありません。そのレコードは、コミットされるまで別のブラウザーに存在しないためです。URL を別の場所に貼り付けて、中断したところから読み込むことはできませんでした。

あなたが本当にやりたいことは、レコードがコミットされていないときに、アプリケーションの状態を別の方法でシリアル化する (つまり、特定性の低い URL を生成する) ことだと思います。serializeこれは、ルートでメソッドをオーバーライドすることで実現できます。

例えば、

App.PostRoute = Ember.Route.extend({
    serialize: function(model, params) {
        if (model && model.get('isNew')) {
            // corresponds to path '/post/:post_id'
            return { post_id: 'new'}
        }

        return this._super(model, params);
    }
});

ここで、新しく作成されたがコミットされていないレコードであるtransitionToRoute('post', post)コントローラーから呼び出すと、アプリケーションの状態がパスにシリアル化されます。を使用してコミットされたレコードを渡すと、通常どおりシリアル化されます。post/post/newid

于 2013-03-03T19:41:02.237 に答える