我已经创建了一个非常基本的主干应用程序,但是我需要执行一个稍微复杂的检查,我无法做到这一点。
我的代码如下。我在这里做的是创建一个聊天参与者列表。实际上,我将通过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
}))
答案 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()。