5

私はBackboneを初めて使用し、データをリアルタイムでグラフ化してマッピングするBackboneアプリを構築しようとしています。このサンプルコードに従ってWebSocketを実装しました。問題は、サンプルコードよりも広範なデータセットを使用したいということです。コードを理解していれば、1つのモデル(単一のポイント配列)を作成しているだけです。各モデルに緯度、経度、および量(数値のみ)があるモデルのコレクションが必要です。

バックエンドがJSONを送信するときに、アプリがそれらの属性を使用して新しいモデルを作成するようにWebSocketを実装するにはどうすればよいですか?これについてブログで読んだことがありますが、Backbone.syncをオーバーライドしてイベントアグリゲーターを実装する必要がありますが、これについて見た唯一の例はsocket.ioを使用しています。バックエンドで使用している言語/フレームワークのため、Socket.ioはオプションではありません。さらに、最終的にはバックエンドを、socket.ioでもサポートされていない別の言語に切り替える予定なので、次のようなライブラリを含まないフロントエンドにWebSocketを実装するためのより一般的な方法を見つけたいと思います。 socket.io。

4

3 に答える 3

4

私は自分の質問に対する解決策を見つけました。繰り返しになりますが、私はBackboneを初めて使用するため、これが最善の方法かどうかはわかりません。このソリューションがベストプラクティスに従っているかどうかについてのフィードバックに関心があります。このコードは、AndrewCholakianによるこの例に基づいています。コードを実行するときに役立ついくつかのprintステートメントを保持しました。

このコードは、バックエンドが次の形式でJSONデータを送信していることを前提としています。 {data: "{"lat": latitude, "long": longitude, "amt": amount}"}

// this function opens the websocket and will trigger add_point when
// a new message is received
Stream = function () {
    _.extend(this, Backbone.Events);
    var self = this;

    self.socket = new WebSocket("ws://" + document.domain + ":5000/websocket");
    console.log("Using a standard websocket");

    self.socket.onopen = function(e) {
        self.trigger('open', e);
        console.log('socket opened');
    };

    self.socket.onerror = function(e) {
        self.trigger('error', e);
    };

    self.socket.onmessage = function(e) {
        self.trigger('message', e);
        self.trigger('data', e.data);
        self.trigger('add_point', JSON.parse(e.data));
    };

    self.socket.onclose = function(e) {
        self.trigger('close', e);
        console.log('socket closed');
    };
};  

DataPoint = Backbone.Model.extend({
    defaults: {
        lat: null,
        long: null,
        amt: null
        }
});

DataSet = Backbone.Collection.extend({
    model: DataPoint,
    initialize: function(options) {
        this.stream = options.stream;
        var self = this;
        this.stream.on("add_point", function(pt) {
            self.add( new DataPoint({
                lat: pt.lat,
                long: pt.long,
                amt: pt.amt
            }));
            console.log('updated collection');
            console.log(self.models);
        });
    }
});

MapView = Backbone.View.extend({
    initialize: function(options) {
        this.dataSet = options.dataSet;
    }
});

$(function() {
    var stream = new Stream();
    var dataSet = new DataSet({ stream: stream });
    var mapView = new MapView({ dataSet: dataSet });
});
于 2013-01-31T22:53:05.473 に答える
1

Backbone.WSを使用すると、ネイティブWebSocketでBackboneリソースを使用できます。追加の依存関係はありません!

于 2015-08-11T11:45:27.090 に答える
0

WebSocket上のWAMPプロトコルに基づいてbackbone.wampを使用できます

于 2015-05-14T16:41:39.803 に答える