可能的范围问题

时间:2013-06-23 14:42:59

标签: node.js backbone.js socket.io

一个可能的node.js / backbone.js / socket.io范围问题我无法解决这个问题。

(摘自) server.js

var app = express();
var server = http.createServer(app);
io = io.listen(server);

(摘自) index.html

<script type="text/javascript" src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect(window.location.origin);
</script>

(摘自) js / views / map.js

(function() {  // self invoking anonymous function so we are able to 
               // create the private variable "map" that can be shared here
var map;
var webSocket = window.socket; 

window.MapView = Backbone.View.extend({

initialize: function() {
    this.render();
    webSocket.on("marker dropped", this.propNewMarker);
},

events: {
    "click .dropmarker" : "dropMarker"
},

dropMarker: function(event) {
    console.log("This fires!!!");
    webSocket.emit('marker dropped', { my: 'data' });
},

propNewMarker: function() {
    console.log("someone dropped a marker (im in map.js)");
},

(摘自) MapView.html

<a href="#" class="btn btn-primary dropmarker">Drop marker</a>

我要采取的行为

单击MapView.html中的“dropmarker”按钮应该在dropMarker中启动webSocket.emit操作。 (它没有任何问题地触发console.log)

测试

当我添加

io.sockets.emit('marker dropped', { 'message': 'ello wurldz' });

进入server.js, map.js 中的 propNewMarker 函数被正确触发。

初步结论

似乎我正在努力解决按钮级别的范围问题。 我无法在那里发起websocket事件。

有什么想法?或者我可以在调试之前在代码中提供更多见解吗? (尽量保持干净)

1 个答案:

答案 0 :(得分:1)

这看起来不像作用域的问题,但事实上你是如何使用套接字

要调用propNewMarker 服务器 必须在marker dropped

上发出消息

如果添加

,则在服务器上
io.sockets.on('connection', function (socket) {
  socket.on('marker dropped',function(msg){
    socket.emit('marker dropped',msg);
  });
});

然后客户应该对事件做出正确回应。我做了一些测试,看起来你的范围很好。

相关问题