2012-07-21 51 views
0

我有一个图像列表,每个图像都有一个“Like”按钮。点击“Like”按钮时,AJAX请求(包含item_iduser_id)将被发送到服务器端以记录Like(通过在和user_id的值中添加likes表中的新行)。

模型Photo用于显示在页面上的图像。如果我理解正确,如果我想更新/添加新的Photo,则使用this.model.save(),因此不适合录制“喜欢”。因此,我必须使用类似$.get()$.post()。这是传统的方式吗?

或者我会创建一个名为Like的新模型,如下所示,这似乎使得只有Like按钮才具有View和模板会变得更加复杂。

Like = Backbone.Model.extend({ 
    url: 'likes' 
}); 

LikeView = Backbone.View.extend({ 

    template: _.template($('#tpl-like').html()), 

    events: { 
     'click .btn_like': 'like' 
    }, 

    like: function() { 
     this.model.save({ 
      user_id: 1234, 
      post_id: 10000 
     }) 
    } 
}); 

回答

0

在类似的情况下,这个我用过的$.get方法,而不是创建一个新的模式,显然这将取决于你的应用程序,但这里有我的原因。

这种情况似乎有以下特点:

  1. Like是一个人与照片之间的关系,
  2. 你似乎有一个接受的照片和用户ID创建一个服务器端资源这种关系已经,
  3. 你可能没有其他信息附加到这种关系,并
  4. 你可能没有重要的观点逻辑去与自己一样

通过向Photo对象添加另一个属性(包含喜欢的数量)可以更好地处理此问题。然后使用$.get创建like,并且200响应将简单地更新照片对象以启动它的计数(从而更新视图)。然后,服务器端在返回时只需要将类似计数作为它的一部分。

我在这里假设一旦制定了like,您将不会更新它。如果您确实需要更新或删除它,我可能仍会继续使用$.get。您可以将likes阵列添加到您的照片对象,其中每个元素都是like资源的ID。该视图将显示数组的长度作为计数,如果需要删除此类数据,则可以使用该ID,并且可以使用$.post。只要确保不要使用.push向数组添加值,因为它会绕过主干的set方法,并且不会获得事件回调。您需要复制数组,然后按,然后在进行更改时进行设置。