- モデル/コレクションの情報を変更する
- Eventy DOM-ツリー
最近、socket.ioイベントをバックボーンに接続する問題を解決する必要がありました。そのため、すべてがバックボーンアプリケーション内にあり、ソケットイベントをビューで直接宣言し、そこで発生するすべてのアクションを記述することができました。
バックボーンスタイルから逸脱しないように、DOMツリーイベントと同じ方法で、つまり次のようにsocket.ioイベントを追加する機能を実現したいと考えました。
var im = Backbone.View.extend({ io_events: { 'new_message': 'newMessage' }, newMessage: function(message_data){ //do something } });
インターネットの拡張を長時間検索した結果、バックボンとソケットを束ねるエレガントではない方法を選択することになり、問題を解決したようですが、私たちが望む方法ではありませんでした。 私は自分で考えなければなりませんでした。
一番下の行。
最終的に、私はあなたと共有したいコードが生まれました。 以下で、彼はそこで実際に何が起こっているのかを実際に説明しています:
var socket = io.connect('127.0.0.1:9999'); var SocketDelegationSkeleton = Backbone.View.extend({ _initSocketio: function(){ if(this.io_events && _.size(this.io_events) > 0) for(var io_event in this.io_events){ var method = this.io_events[io_event]; // if (!_.isFunction(method)) { method = this[method]; // _.bind(method, this); // this socket.on(io_event, method); // socket.io }else{ throw new Error(' ' + '"' + method + '"' + ' '); } } } });
これで、socket.ioが使用する各ビューをSocketDelegationSkeletonから
SocketDelegationSkeleton
、イベントを宣言し、
SocketDelegationSkeleton
を
initialize
する必要があります
_initSocketio();
var im = SocketDelegationSkeleton.extend({ io_events: { 'new_message': 'newMessage' }, initialize: function(){ this._initSocketio(); } newMessage: function(message_data){ //do something } });
利益!