我是 Backbone 的新手,我正在尝试构建一个 Backbone 应用程序来实时绘制和映射数据。我实现了一个 websocket 以下this https://github.com/andrewvc/d3-backbone-presentation/blob/master/04_websockets_bb.html示例代码。问题是,我想使用比示例代码更广泛的数据集,如果我理解代码,它只是创建一个模型——单个点数组。我想要一个模型集合,其中每个模型都有纬度、经度和数量(只是一个数值)。
如何实现 websocket,以便当我的后端发送一些 JSON 时,我的应用程序使用这些属性创建一个新模型?我在博客上读到过,我需要重写 Backbone.sync 并实现事件聚合器,但我见过的唯一示例使用了 socket.io。由于我在后端使用的语言/框架,Socket.io 不是一个选项。此外,最终我将把后端切换到另一种也不被socket.io支持的语言,所以我想找到一种更通用的方法来在前端实现websocket,而不涉及像这样的库套接字.io。
我已经找到了一个有效的解决方案来解决我自己的问题。再说一次,我是 Backbone 的新手,所以我不确定这是否是最好的方法 - 我会对有关此解决方案是否遵循最佳实践的反馈感兴趣。该代码基于这个例子 https://github.com/andrewvc/d3-backbone-presentation/blob/master/04_websockets_bb.html作者:安德鲁·乔拉基安。我保留了一些打印语句,当您运行代码时它们会很有帮助。
该代码假设您的后端正在以以下形式发送 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 });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)