【问题标题】:Backbone remove row by IDBackbone 按 ID 删除行
【发布时间】:2014-10-19 09:43:57
【问题描述】:

我正在尝试使用 Backbone 删除表格中的一行。我正在为这个项目使用 Rails 4 和 Backbone-on-rails gem。

我正在使用 addEntryevent 在我的 Movies 表中添加行。这会添加一个包含 id、movie_title 和 user_id 的新行。

索引视图

class Movieseat.Views.MovieseatsIndex extends Backbone.View

  template: JST['movieseats/index'] 

  initialize: -> 
    @collection.on('update', @render, this)
    @collection.on('add', @appendEntry, this)

  render: -> 
    $(@el).html(@template())
    @collection.each(@appendEntry)
    this

  events: -> 
    "click li": "addEntry" 
    "click .remove": "removeEntry" 

  addEntry: (e) -> 
    movie_title = $(e.target).text()
    @collection.create title: movie_title

  removeEntry: (e) -> 
    thisid = @$(e.currentTarget).closest('div').data('id')
    console.log thisid
    @collection.remove thisid

  appendEntry: (entry) ->
    view = new Movieseat.Views.Entry(model: entry)
    $('#entries').append(view.render().el)

当我点击 .remove 元素时,我会得到一个控制台日志结果,显示存储在我要删除的元素中的 id。

条目视图

class Movieseat.Views.Entry extends Backbone.View

    template: JST['movieseats/entry']
    className: 'movie-frame'

    render: -> 
      $(@el).html(@template(entry: @model))
      this

这是我的 index.jst.eco 模板

<h1>Movies</h1>

<div id="entries"></div>

这是我在 index.jst.eco 模板中渲染的 Entry 模板(我正在这样做,所以我只重新渲染添加到视图中的电影电影。

<div class="movie-frame" data-id="<%= @entry.get('id') %>">
    <p><%= @entry.get('title') %></p>
    <p class="remove">Remove</p>
</div>

还有我的主干路由,

class Movieseat.Routers.Movieseats extends Backbone.Router

  routes:
    '': 'index'

  initialize: ->
    @collection = new Movieseat.Collections.Movieseats()
    @collection.fetch()

  index: ->
    view = new Movieseat.Views.MovieseatsIndex(collection: @collection)
    $('#container').html(view.render().el)

但是当我点击 .remove 元素时没有网络活动。 addEntry 事件触发时有网络活动。

【问题讨论】:

  • 尝试删除缩进,目前 addEntry 和 removeEntry 是事件对象的方法。将它们定义为 View 本身的方法。
  • 缩进来自粘贴代码。在我的编辑器中,缩进是正确的。
  • 很好。好吧,如果没有更多的上下文,目前这个问题似乎是无法回答的。 .movie-frame 是视图的子/后代吗?
  • @Vohuman 我更新了我的帖子,提供了更多细节。 .movie-frame (到目前为止我可以看到)只是一个由 Entry 视图呈现的容器。
  • 问题可能是在我的 Movie Rails 控制器中我没有定义销毁方法吗?

标签: javascript jquery mysql ruby-on-rails backbone.js


【解决方案1】:

显然@collection.remove 没有发出 HTTP 请求。将其更改为 @collection.get(thisid).destroy() 就可以了。但是你仍然需要在 Rails 控制器中创建一个 destroy 方法,

Backbone 视图索引中的 removeEntry 事件,

removeEntry: (e) -> 
  thisid = @$(e.currentTarget).closest('div').data('id')
  @collection.get(thisid).destroy()

Rails 控制器中的destroy方法,

def destroy
  movie = Movie.find_by_id(params[:id])
  movie.destroy

  respond_to do |format|
    format.json {render :json => {:msg => "item deleted!"},:status => 200}
  end

end

【讨论】:

  • 其实@collection.remove可以移除模型,但是你应该传递一个模型而不是模型id。
  • 当您说“通过模型”时,您的意思是正确的主干模型。我看到它的方式是模型是我用 Rails rails generate model Movie title:string 生成的表你能解释一下 Rails 模型和主干模型之间的区别吗?
  • 对,你可以从集合中获取Backbone模型,然后将其传递给remove方法,collection.remove存在,所以我们可以传递几个模型给它以删除。骨干模型只是服务器端模型的表示,修改它们而不将它们与服务器端数据库有效地同步是没有效果的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2011-06-25
  • 2022-08-14
  • 2017-04-25
  • 2020-01-24
  • 2019-03-19
  • 1970-01-01
相关资源
最近更新 更多