使用带有socket.io Backbone.js的(Using backbone.js with

2019-10-17 13:22发布

我试图进入Node.js的世界,想建立一个简单但完整的测试应用程序挂接使用Redis的作为存储与socket.io的Node.js和Backbone.js的。 我发现一对夫妇教程和几个例子也是如此。 不知怎的,我只是感到困惑对整个架构我必须使用。 通常你定义你的server.js与快递内的所有路线。 所以你在服务器端的路由的完全控制。 现在衔接必须重新定义路由骨干? 这似乎是一个模型方面,但对我来说似乎是双重的工作,我不喜欢莫名其妙。 所以我才刚刚困惑,工作的事情完全不同? 也许有人有一个链接到它变得更加清晰了良好的教程或例子。

Answer 1:

现在衔接必须重新定义路由骨干?

取决于你的意思是通过什么途径。

你需要告诉骨干在哪里可以找到服务器资源,所以它是有意义的模型告诉它在哪里得到它(在模型URL参数)。

在骨干路由类无关与服务器上的路线。 这仅仅是改变应用程序状态或页面内显示的视角的方式。

例如在LOB应用程序,你有一个列表视图和详细资料视图。

骨干让您无需刷新页面通过路由器的视图之间切换。

对于列表中的URL可以是http://app.com/#list ,对于详细视图中的URL可以是http://app.com/#detail/:id其中id是产品ID。 您可以在视图之间无需刷新页面只需单击定义为一个链接切换

<a href="#detail/1">product 1</a> 

再回到列表视图

<a href="#list">product list</a>

那么你可以有显示产品形式的视图

<a href="#newproduct">Create a new product</a>

等等。 所以你不必设置事件侦听器在你的意见,看法不应该知道每个人之间进行切换,并且可以在不要求任何东西到服务器,而无需刷新页面。 这是构建您的应用程序conveniant方式。



Answer 2:

我使用前端骨干型号类似的东西

class Model extends Backbone.Model

    idAttribute: '_id'

    _sync: (method, model, options) =>
        options.data ?= {}
        @socket.emit method, @name(), model.toJSON(), options.data, (err, data) => 
            if err then console.error "error in sync with #{method} #{@.name()} with server (#{err})" else options.success(data)

    sync: (method, model, options) => 
        if @socket.connected() is no 
            @socket.once 'connect', => @_sync method, model, options
        else 
            @_sync method, model, options

    name: => 
        if @collection and @collection.name then return @collection.name else throw new Error "Socket model has no name (#{@.collection})"

    initialize: ->
        @socket = require('socket')

module.exports = Model

这是我的基本骨干收藏

class Collection extends Backbone.Collection

    model: require('class/socket/model')

    _sync: (method, collection, options) =>
        @socket.emit method, @.name, collection.toJSON(), options.data, (err, data) => 
            if err then console.error "error in sync with #{method} #{@.name} with server (#{err})" else options.success(data)

    sync: (method, collection, options) => 
        if @socket.connected() is no 
            @socket.once 'connect', => @_sync method, collection, options
        else 
            @_sync method, collection, options

    garbage: false

    register: =>
        @socket.emit 'register', @name

    deregister: =>
        @socket.emit 'deregister', @name
        @garbage = true

    initialize: (options) ->
        @name = options.name if options and options.name
        if !@name then throw new Error 'Socket collection has no name'
        @socket = require('socket')

        # Registrating socket for connection
        @socket.on 'connect', => @register() if @garbage is off
        if @socket.connected() is yes then @register()

        @fetch()        

        # Registration for socket events for this collection
        @socket.on @name, (method, model) =>

            if method is 'reset'
                @reset(model)

            if method is 'delete'
                m = @get model._id 
                m.trigger 'destroy', m, m.collection

            if method is 'update'
                m = @get model._id
                m.set(model)

            if method is 'create'
                @add(model)

            console.log "SOCKET: " + method + " triggered for collection " + @name

module.exports = Collection;

这是CoffeeScript的,如果你不介意的话。

我见过使用寄存器中的所有教程/注销的集合。

更重要的事情是要找到一种方法来介绍认证与那些收藏和模型的后端。 它并不难,但它的棘手。

另外要小心为同一用户管理两个套接字连接。 它需要插座更新发送到同一个用户,但其他的连接。



文章来源: Using backbone.js with socket.io