骨干破坏入口

时间:2014-10-18 14:45:17

标签: ruby-on-rails backbone.js

我正在创建一个允许用户将电影标题添加到其主页的应用。这(最后)工作得很好。我正在使用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

2 个答案:

答案 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,就应该解决你的问题。