Javascript 主干/木偶-检查模型是否存在

Javascript 主干/木偶-检查模型是否存在,javascript,arrays,backbone.js,marionette,backbone-views,Javascript,Arrays,Backbone.js,Marionette,Backbone Views,我已经创建了一个非常基本的主干应用程序,但是我需要执行一个稍微复杂的检查,我在执行这个检查时遇到了困难 我的代码如下。我在这里做的是创建一个聊天参与者列表。实际上,我将通过javascript函数发送此列表 Participant = Backbone.Model.extend({}); Participants = Backbone.Collection.extend({ model: Participant }); ParticipantVi

我已经创建了一个非常基本的主干应用程序,但是我需要执行一个稍微复杂的检查,我在执行这个检查时遇到了困难

我的代码如下。我在这里做的是创建一个聊天参与者列表。实际上,我将通过javascript函数发送此列表

   Participant = Backbone.Model.extend({});

    Participants = Backbone.Collection.extend({
        model: Participant
    });

    ParticipantView = Backbone.Marionette.ItemView.extend({
        template: "#participant-template",
        tagName: 'div',
        className: 'call-participant',

        initialize: function () {
            this.$el.prop("id", this.model.get("chatid") + "-" + this.model.get("participantName"));
        },
    });

    ParticipantsView = Backbone.Marionette.CompositeView.extend({
        template: "#participants-template",
        tagName: 'div',
        itemView: ParticipantView,

        appendHtml: function(collectionView, itemView) {
            collectionView.$el.append(itemView.el);
        }
    });

    MyApp.addInitializer(function(options)) {
        var participantsView = new ParticipantsView({
            collection: options.participantNames
        });
        MyApp.participantContainer.show(participantsView);
            var participantsModel = new Participants();
    };

    $(document).ready(function() {        
        MyApp.start({participantsModel: participantsModel});
    })
我遇到的问题是,当人们离开/加入聊天室时,消息会被新的参与者列表重新发送(例如,一些参与者名称值将不存在)

那么问题是:在backbone.marionete中,我如何告诉它将现有模型与新的模型列表进行比较(对于给定的chatid),如果该模型不再在列表中,请删除该模型,如果列表中有非模型的内容,请添加它。 您将看到我正在根据chatid和participantName构建我的ID(请注意,名称是唯一的,它实际上是我在没有@server的情况下发送的JID)。ID的格式是这样的,因为我在一个页面上会有大约5-10个列表,所以我不想开始更新错误的聊天

多谢各位。请询问您是否需要其他信息。 jsFiddle:

亲切问候,

加里·谢尔吉尔

编辑:我知道get和set,但老实说,我不知道如何使用它们。我试着读过关于他们的书

编辑:下面是现场场景。我有一个javascript函数,用于侦听pubsub事件,当它接收到正确的事件时,它会创建一个参与者对象数组:

    var participants = [];
    $(iq).find('participants').each(function() {
        var participantsNodes = this.childNodes;
        for (var i = 0; i < participantsNodes.length; i++) {
            var participantAttr = participantsNodes[i].attributes
            var participant = participantAttr[0].nodeValue;
            participants.push({"participantName": participant, "chatid": chatid});
        }
    });
    var chatid = $(iq).find('chatid').text();
    ...

                participantsModel.add(new Participants({
                    chatid : chatid,
                    participantArray : participants
                }))
var参与者=[];
$(iq).查找('参与者').每个(函数(){
var participantsNodes=this.childNodes;
对于(变量i=0;i
基于评论中的对话

主干网的Collection.set函数将为您解决此问题。您可以添加一组新的参与者,它将识别哪些是新的,哪些是旧的,并将相应地触发添加和删除事件

不过,您需要添加一个参与者数组,而不仅仅是添加一个名称数组。不过,你可以很容易地用map来处理这个问题

//array of names from sonewhere
arr = getNamesFromServer()
arrOfParticipants = arr.map(function(name) {
  id = calculateChatID(name,/*whatever else you need */)
  return new Participant(name:name,chatID: id);
}

participantNames.set(arrOfParticipants)
具体如何跟踪参与者以及在何处获取更新取决于您


当然,如果您可以在服务器上将信息格式化为正确的格式(一个与参与者匹配的json对象数组),那么您应该只使用主干内置的同步函数,它将为您处理所有这些。然后,一旦您设置了与客户端命名方案匹配的RESTful URL,或者覆盖了模型/集合的URL属性,您就可以调用participantNames.fetch()。

请提供有关您正在尝试执行的操作以及迄今为止尝试的操作的更多信息。抱歉,我在输入标签时按了回车键,它很早就发布了。主干网的
集合。set
功能为您解决了这个问题。您可以添加一组新的参与者,它将识别哪些是新的,哪些是旧的,并将适当地触发添加和删除事件Hi Ben,感谢您的回复。所以我会按照
ParticipantsView.set(participantArray)
的思路做一些事情,其中participantArray是一个名称数组,我会将chatid作为一个单独的属性发送吗?e、 g.
participantNames.add(新参与者({participantArray:participantArray,chatid:chatid}))
。在这种情况下,我如何确保将.set发送到正确的集合?将代码稍微更新到我在live中期望的程度。我强烈建议为您的集合添加一个
id
属性,以便主干的collection.set可以为您执行所有处理,您可以避免这种映射。我已经暂停了这个功能,直到我能够修复代码中的另一个问题,即停止这个主题的进展。谢谢你的帮助,我不认为这个bug需要太长时间来修复,所以很快就会恢复这个功能。