1

Rails を利用した新しいアプリ (Active Model Serializers を使用) に Ember.js を使用することを検討しています。フレームワークについて頭を悩ませているので、これは少し初心者の質問かもしれません。

私のデータ構造は次のようなものです(簡略化):

Event Days --
    Events -- 
       * Participants
       * Location

「イベント日」内には、何千ものイベントが存在する可能性があります (イベント内には、数十人の参加者とそのすべてのデータがあります)。

イベント日のリストを取得したいときに、EventDays だけでなくすべてのイベント (およびそこにあるすべてのデータ) を含む JSON をロードするのは「間違っている」ようです...基本的に、それはロードされます木全体!

アクションにカスタムシリアライザーを使用することでこの問題を解決できると思いましたが、ある時点でデータを取得する必要があり、Ember はサーバーを再度呼び出すことはないようです。

そのため、EventDays をロードし、その中にイベント データがない場合、「show」メソッドをクリックしても、Ember がサーバーを呼び出して EventDay オブジェクトを更新することはありません。

ここではっきりしているのかどうかわかりません。この点で私より少し先を行っている人が、私が運転していることを理解してくれることを願っています!

本当に私はそれが2つの質問に要約されると思います:

1) リクエストに関する情報を適切に除外して、ローカル オブジェクトのみが入力されるようにする方法 (つまり、index メソッドの呼び出しでは、子のないイベント日のリストが必要ですが、show メソッドの呼び出しでは、単一のオブジェクトが必要です)次のレベルダウンで満たされたイベント日)

2) Ember が適切なタイミングでオブジェクトを「リロード」して、適切なコンテンツを埋める方法

たぶん、私はこれを間違って見ています-Emberのようなもののポイントを見逃しています-もしそうなら、適切なチュートリアルへのポインタを歓迎しますが、全体をロードする以外の方法を説明するものは(Emberサイトでも)見つかりません一気に木。ギグのデータを使用すると、これは遅く、明らかにブラウザーキラーであり、まったく間違っているように見えます.

学ぶのを手伝ってくれた StackOverflow の兄弟たちに感謝します!

編集

何らかの理由ですぐに反対票を投じられたので、コードを追加します。

クライアント側:

App.EventDay = DS.Model.extend({
  day: DS.attr('date'),
  events: DS.hasMany("Event", {async: true})
});

サーバ側:

class EventDaySerializer < ActiveModel::Serializer
  attributes :id, :day
  has_many :events, embed: :ids, key: :events
end

編集 2

kertap の提案の後、async 属性を追加し、上記のシリアライザ コードを更新しました。

jsonはここにあります:

{"event_day":
    {"id":2,
    "day":"2013-12-05",
    "events":[1,2,3,4,5,6,7,8]
    }
}

key: :eventsシリアライザーでパラメーターを使用しない"event_ids": [1,2,3,4]と、正しいと思うかもしれませんが、Ember はイベントを認識しません。

また、注目に値するのは、私がこれを行う場合:

HorseFeeder.ApplicationSerializer = DS.ActiveModelSerializer.extend({});

その後、何も機能しません。私は得るError while loading route: Error: Assertion Failed: The response from a findAll must be an Array, not undefined

Ember と Rails の基本的な配線を機能させるのは、これほど難しいことではないと思います...

4

1 に答える 1

0

リレーションシップが非同期であることを ember データに伝えることができます。

App.EventDay = DS.Model.extend({
  day: DS.attr('date'),
  events: DS.hasMany("Event", {async: true})
});

これを実行してすべての EventDays を取得すると、サーバー側から EventDays のリストが取得されます。サーバー側は、イベント日に含まれるイベントの ID で応答する必要があります。または、すべてのイベントへのリンクである URL を提供できます。Ember は、必要になるまでイベントをロードしません。

次に、イベントの日の show メソッドを呼び出し、テンプレートでその日のすべてのイベントを取得すると、ember データがオフになり、イベントのデータが取得されます。

于 2013-12-09T16:23:59.250 に答える