1

私はangularjsでいくつかの簡単なことをやって遊んでいます。PubNub、PubSub、Pusherなどのリアルタイムメッセージングを組み込みたいと思いました。基本的には動作していますが、一部の領域では面倒すぎるようです。たぶんあなたは私にもっと良い方法を見せてくれるでしょう。

さて、これが私の動作中のjsfiddleです(pubsubが偽造されています)http://jsfiddle.net/canree/dD5VR/

外部サービス(pubsub)があり、そのための角度サービスを作成しました。アプリの他の部分がこの具体的な実装に依存することを望まないので、送信されたinboxすべてのメッセージを格納する別の部分()を作成することにしpubsubました。そして、これinboxは私のアプリ全体の依存関係になります(ではなくpubsub)。

だから私は私の依存関係を次のようにしたいと思います:

controller -> inbox -> pubsub

メッセージを受信したら、コントローラーがメッセージを認識してそれに応じて反応できるようpubsubに、メッセージを追加する必要があります。inbox問題は、この後方依存関係()が必要ないことですpubsub -> inboxpubsubメッセージを受信したことをオブザーバーに通知したいと思います。

私が今持っているのは醜いコールバック登録です(受信トレイはpubsubにコールバックを登録します)。thisボイラープレートがたくさんあるので(取り扱いなど)あまり好きではありません。

それらのサービスを接続する他の方法があるのだろうか?イベント(ただし、どこでも使用することを強制されることなく$rootScope)?もしそうなら、そのようなイベントハンドラーをどこに登録しますか?サービスはイベントを受け取ることができますか?

提供されているフィドルを見て、それをより良い方法で解決する方法を教えてください。

4

1 に答える 1

2

アプリの他の部分がこの具体的な実装に依存することを望まない

サーバーとのやり取りは、pubsubサービスですでにラップ/抽象化されています。サーバーとの相互作用を変更する必要がある場合、サーバーはすでにそのサービスに分離されています。抽象化レイヤーをもう1つ追加しても、(すでに見てきたように)作成する必要のある余分なコードを相殺するのに十分な金額になるとは思いません。

コードを単純化する方法に関する他のいくつかの所見を次に示します(これのいくつかはおそらくすでに知っていますが、他の人にとっては有益かもしれません):

  1. content()関数は必要ありません(特にメッセージはプライベートデータではないため)。Angularでは、コントローラーの$ scope / modelがサービスモデルに直接関連付けられていることが多いため、次のように簡単に使用できます $scope.messages = inbox.messages;
    (content()関数が気に入った場合は、受信トレイサービスでメッセージをプライベートにすることを検討してください)。

  2. 受信トレイのメッセージ配列への変更に関するイベントを受信トレイコントローラーに送信する必要はありません。append()関数は、$rootScope。$digest()を呼び出す必要があります。実際には、実際のサービスは$httpまたは$resourceを使用している可能性が高いため、これはおそらく必要ありません。これらは自動的に$ apply()または$digestを呼び出します。したがって、_broadcastNewMessage()は必要ありません。また、コントローラーの$scope。$on()も必要ありません。
    content()関数をそのままにしておいても、何もブロードキャストする必要はありません。

  3. 受信トレイはpubsubに依存しているため、受信トレイサービス自体を登録する必要があります pubsub.subscribe(this.append, this);

  4. pubsubのinit()メソッドはインラインにすることができます(関数は必要ありません)

上記のすべての観察結果を組み込んでいじってください。

それらのサービスを接続する他の方法があるのだろうか?

モデルの共有(たとえば、service1:this.service1_obj_or_obj_property = service2.service2_obj_or_obj_property)と、他のサービスが呼び出すことができる依存サービスでの関数の作成についてのみ考えることができます。

サービスはイベントを受け取ることができますか?

$onと$broadcastはスコープで定義されており、サービスはシングルトンであり、スコープの影響を受けないため、答えは「いいえ」であると確信しています。

于 2012-12-18T02:29:02.713 に答える