node.js - Socket.io 和 Backbone

标签 node.js backbone.js socket.io

我正在尝试学习 socket.io,我决定将 socket.io 添加到我之前构建的主干应用程序中。

所以使用 require.js 我的主 app.js 文件中有以下内容:

require(
    ["jquery",
    "underscore",
    "backbone",
    "bootstrap",
    "view/postsview",
    "model/model",
    "collection/collection",
    "socketio",


],
  function($, _, B,boot, postsView, model, collection, io) {

   $(function() {


        window.socket = io.connect('http://127.0.0.1');

        var postmodel = new model();
        var postcollection = new collection();

        window.socket.on('newPost', function (data) {
            postcollection.create(data);
        });

        var posts = new postsView({model:postmodel, collection:postcollection});
        posts.render();
        $(".maincontainer").html(posts.el);
    }
});

如您所见,我的套接字是一个全局变量。因为我想在我的 backbone.view 中向这个套接字发送一些东西。我是 javascript 的新手,我知道使用全局变量并不总是最佳做法。

我的 Backbone View 看起来像:

var FormView = Backbone.View.extend({
    template: _.template(formTemplate),

    render: function(){
        this.$el.html(this.template());
    },

    events:{
        'click #submit-button' : 'save'
    },

    save: function(e){
        e.preventDefault();
        var newname = this.$('input[name=name-input]').val();
        var newadress = this.$('input[name=adress-input]').val();

        this.collection.create({
            name: newname, 
            adress : newadress, 
            postedBy: window.userID
        });

        window.socket.emit('postEvent' , {
            name: newname, 
            adress : newadress, 
                    postedBy: window.userID
        });

    }
});

最后这是我的 app.js 在服务器端的样子:

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
  socket.on('postEvent', function (data) {
    socket.broadcast.emit('newPost', data);
  });

});

这现在工作正常,但我不确定这是否是将 socket.io 与主干一起使用的正确方法。首先,我不喜欢将 socket 元素分配为全局变量。还有另一种方法可以在我的 View 中使用 reach my socket 吗?总的来说,我愿意接受任何建议,我应该如何将 socket.io 与 Backbone 一起使用。

最佳答案

我认为您对 backbone 和 socket.io 的使用看起来不错。我建议你看看 marionette在 Backbone 中为您完成一些繁重的工作,并为您提供更多的工作框架。

删除全局变量的典型方法是创建一个模块,其中包含对该变量的唯一引用和该变量的设置。由于模块由 requirejs 缓存,您将可以在任何地方访问相同的对象。

在这种情况下,您可以创建一个 socket.io 模块:

define(["socketio"], function (io) {
  var socket = io('http://localhost');

  return socket;
});

然后您可以像引用 backbone 或 jquery 一样引用此模块:

require(["yoursocketmodule", "underscore"],
  function(socket, _) {
    socket.emit('test');
  });

您还可以使用 backbone.wreqr 让您的 socket.io 模块在总线上发出事件,这样您的 View 就不需要直接引用 socket.io 及其事件。如果您想使用与 socket.io 不同的东西,想要重新连接,做一些错误处理等,这很有用......您真的希望将这些东西放在一个单独的模块中。

关于node.js - Socket.io 和 Backbone ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17732091/

相关文章:

javascript - Chromecast崩溃

websocket - 在 React Native 中发送和接收类似 Websockets 的消息

javascript - Tensorflow.js 中的内存泄漏 : How to clean up unused tensors?

javascript - 使用 babel 时出现意外的保留字 'import'

javascript - Backbone ListenTo 不会将 jquery 函数作为处理程序触发

node.js - Node : How do I store data in an express session, 以便我可以从 socket.io 访问它?

node.js - 如何使用 mongoose 获取 MongoDb 中创建的集合的 id?

javascript - 有没有办法检查JS中的字符串是否是单个表情符号?

javascript - 刷新 Firebase token

javascript - 如果内容未保存,则防止导航到另一个 View