Backbone 和 Strophe muc 插件:处理传入事件

Posted

技术标签:

【中文标题】Backbone 和 Strophe muc 插件:处理传入事件【英文标题】:Backbone and Strophe muc plugin: Handle incoming events 【发布时间】:2012-06-27 07:55:32 【问题描述】:

我收到了发送到房间的最后一条消息,这些消息也将显示在视图中,但是如果有新消息进入 Strophe 事件处理程序,尽管我看到通过线路传入的消息节(连接上的 xmlInput),但不会触发。

这可能是什么原因?

连接后我创建 MessageList 并注册 Strophe 处理程序:

 Messages = new MessageList();
 XMPPConnection.addHandler(Messages.onMessageReceived, null, "message", "groupchat");
 XMPPConnection.send($pres(to: "room@conference.server.local/user1").c("x", xmlns: "http://jabber.org/protocol/muc"));
 window.App = new AppView();

还有 MVC:

// ----------------- Message Model  ----------------   
var Message = Backbone.Model.extend(
  body: "default message",

  initialize: function(body) 
      if (body) 
        this.set(body: body);
      
        
);

// ----------------- Message Collection  ----------------   
var MessageList = Backbone.Collection.extend(
 model: Message,

 initialize: function(body)        
 ,

 onMessageReceived: function(body) 
     var message = new Message($(body).text());
     Messages.add(message);
     return true;
            
);

  // ---------------- Message View -------------------  
var MessageView = Backbone.View.extend(
  tagName: "li",

  template: _.template($("#message-template").html()),
  events: ,
  initialize: function() 
      this.model.bind("change", this.render, this);
   //   this.model.bind("remove", this.remove, this);
  ,

  render: function() 
      this.$el.html(this.template(this.model.toJSON()));
      return this;    
          
);  

// ---------------- App View -------------------  
var AppView = Backbone.View.extend(
    el: $("#myapp"),

    initialize: function()               
       Messages.bind("add", this.addOneMessage, this);
       this.main = $('#main');
    ,

    addOneMessage: function(message) 
        var view = new MessageView(model: message);
        this.$("#message-list").append(view.render().el);
    ,
 );

【问题讨论】:

【参考方案1】:

有一些地方出了问题,这里有一些提示:

你的Message 模型应该写成:

var Message = Backbone.Model.extend(
  defaults: 
      body: "default message",
  
);

不需要初始化,如果你传递属性,它们将被分配。

您的收藏:

var MessageList = Backbone.Collection.extend(
    model: Message,
);

我还将 onMessageReceived 放在 MessageList 之外:

 var onMessageReceived = function(body) 
     Messages.add(body: $(body).text());
     return true;
            

您的 MessageView 可以更简单,MUC 消息不会改变,它们只是被添加:

var MessageView = Backbone.View.extend(
  tagName: "li",

  template: _.template($("#message-template").html()),
  render: function() 
      this.$el.html(this.template(this.model.toJSON()));
      return this;    
          
);  

希望这能让你继续前进……

【讨论】:

以上是关于Backbone 和 Strophe muc 插件:处理传入事件的主要内容,如果未能解决你的问题,请参考以下文章

strophe muc 下降组邀请节

在 muc room 中使用 Strophe 发送 XHTML 消息

Strophe MUC 邀请拒绝处理程序未触发

使用 Xmpp、strophe.js 进行聊天应用

如何确保聊天室成功? (instance.connection.muc.leave())

无法启用 muc_size 韵律插件