Backbone / Marionette - 检查模型是否存在

时间:2014-05-01 14:41:55

标签: javascript arrays backbone.js marionette backbone-views

我已经创建了一个非常基本的主干应用程序,但是我需要执行一个稍微复杂的检查,我无法做到这一点。

我的代码如下。我在这里做的是创建一个聊天参与者列表。实际上,我将通过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.marionette中,我如何以及在何处告诉它将现有模型与新模型列表进行比较(对于给出chatid),如果模型不再在列表中,则删除模型,如果列表中的某些内容不是模型,请添加它。 您将看到我正在从chatid和participantName构建我的ID(请注意,该名称是唯一的,它实际上是我在没有 @server 的情况下发送的JID)。 ID格式化的原因是我在一个页面上有大约5-10个列表,所以我不想开始更新错误的聊天。

谢谢。请询问您是否需要其他信息。 jsFiddle:http://jsfiddle.net/966pG/175/

亲切的问候,

Gary Shergill

编辑:我知道得到并设定,但坦率地说不知道如何使用它们。我已经尝试过阅读这些内容" http://backbonejs.org/#Model-get"。

编辑:下面的实时场景。我有一个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
                }))

1 个答案:

答案 0 :(得分:2)

基于评论中的对话

Backbone的Collection.set功能可以为您解决这个问题。您可以添加一组新的参与者,它将识别哪些是新的,哪些是旧的,并将适当地添加和删除事件。

您需要添加一个参与者数组,但您不能只添加一组名称。你可以很容易地用地图处理它。

//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对象数组),您应该使用Backbone的内置同步功能,这将处理所有这些为了你。然后,一旦您设置了与客户端命名方案匹配的RESTful URL,或覆盖模型/集合上的url属性,您就可以调用participantNames.fetch()。