我正在创建一个允许用户将电影标题添加到其主页的应用。这(最后)工作得很好。我正在使用rails gem上的主干。
我正在使用以下代码在我的收藏集中创建一个新条目
events: ->
"click li": "addEntry"
addEntry: (e) ->
movie_title = $(e.target).text()
@collection.create title: movie_title
这是我的收藏品
class Movieseat.Collections.Movieseats extends Backbone.Collection
url: '/api/movies'
defaults:
title: ""
但我想知道如何销毁一个条目?当我在Backbone页面上查找destroy时,它会显示Destroys the model on the server
。但我不想删除整个模型,只是模型中的一个条目。
我会做一个像这样的新事件,但显然这不起作用。
events: ->
"click .destroy": "destroyEntry"
destroyEntry: (e) ->
@collection.destroy $(e.target)
经过一些谷歌搜索后,我发现它应该被删除而不是销毁,但这段代码不起作用。虽然它在Fiddle
中有效destroyEntry: (e) ->
thisid = @$(e.currentTarget)
thisitem = @collection.get(thisid)
@collection.remove thisitem
答案 0 :(得分:1)
你应该看看Backbone Marionette - 它使这样的场景变得更容易管理。
它带有一个内置的复合视图,它基本上包含一个集合,集合中的每个模型都带有一个包含模型的ItemView。
然后,您可以收听特定模型视图内容的事件。因此,您可以访问@model.get('id')
。这使得@collection.remove(@model.get('id'))
非常容易。
它还带有内置的pub子框架,所以在你的ItemView中你可以说
@trigger "movie:title:removed", @model
在父综合视图中,您可以执行
@listenTo "childview:movie:title:removed", (movie) ->
@collection.remove(movie)
答案 1 :(得分:1)
我认为你的问题是这段代码:
destroyEntry: (e) ->
thisid = @$(e.currentTarget)
thisitem = @collection.get(thisid)
@collection.remove thisitem
首先,您不需要让Model
将其从Collection
中删除; remove
也可以使用ID。这在Backbone文档中没有得到很好的宣传,但是如果您查看来源,可以看到remove
确实为您处理了get
:
model = models [i] = this.get(models [i]);
因此,您可以将事情简化为:
destroyEntry: (e) ->
thisid = @$(e.currentTarget)
@collection.remove thisid
但由于你的thisid
不是一个字符串,它仍然无法解决问题,它是一个jQuery数组。 Backkbone期望ID为:
任意字符串(整数id或UUID)
所以,这一切都归结为您的@$(e.currentTarget)
,以及您如何在其上存储Model
ID。您是否使用Model
的ID作为元素ID?如果是这样,你可以这样做:
thisid = @$(e.currentTarget).attr('id')
另一方面,如果您将ID存储在数据中,则需要更多类似的内容:
thisid = @$(e.currentTarget).data('id')
最重要的是,您需要一个有效的ID才能使remove
正常工作。一旦你得到这样的ID,就应该解决你的问题。