0

さて、db から取得した複数の要素 (同じ列名) をチャネル ペイロードに渡す良い方法を探しています。

例:は,ppl = Repo.all(People)を含む 2 つの結果を返します。(列名) は Mike と John の両方に使用されますが、チャネル ペイロードを通過するときは 1 つのマップしか渡すことができず、同時に両方の名前: John、名前: Mike を持つことはできません。id: 1, name: Mikeid: 2, name: Johnname:

チャネルを理解したように、クライアントに送り返すマップ (ペイロード) を使用します。データベースから取得した情報に基づいて、html を動的に生成する予定です。したがって、People からすべての ppl を 1 つのマップ/ペイロードで渡す必要があります。

私の現在の計画は、ppl 用に個別にマップを作成する再帰関数のようなものを作成することです。%{name1: John}そして、それらとパスを 1 つのマップとして結合するために%{name2: Mike}使用します。Map.mergeだから、私の質問: ペイロードで同じテーブル (同じ列) から複数の要素をパスするより良い方法はありますか? 任意の提案/推奨事項をいただければ幸いです。

ありがとう!

4

1 に答える 1

1

だから、私の質問: ペイロードで同じテーブル (同じ列) から複数の要素をパスするより良い方法はありますか?

ドキュメントには、ペイロードはマップでなければならないと書かれていますが、シリアル化可能なものなら何でも含めることができます。

Phoenix.Channel.broadcast(ソケット、イベント、メッセージ)

ソケット トピックのすべてのサブスクライバーにイベントをブロードキャストします。

イベントのメッセージはシリアライズ可能なマップでなければなりません。

https://hexdocs.pm/phoenix/Phoenix.Channel.html#broadcast/3

したがって、次の 2 つの方法のいずれかを使用して、ペイロードのキー内にリストを渡すことができます。

Poison.Encoderのインスタンスがある場合はPerson、次のことができます。

broadcast socket, "people", %{people: Repo.all(Person)}

それ以外の場合は、クエリから必要なキーのみをマップに直接選択し、それを送信します。

people = from(p in Person, select: map(p, [:id, :name])) |> Repo.all
broadcast socket, "people", %{people: people}

次に、(いずれの場合も) を使用して JS の配列としてアクセスしますpayload.people

于 2016-08-28T07:05:58.300 に答える