0

我正在使用 collection.create 方法添加模型。我已经覆盖了 model.validate 方法并且弹出错误窗口我得到了正确的错误消息。

一切似乎都很好,直到我第四次点击保存按钮。为每个先前的无效模型触发无效事件。我注意到当无效事件触发时集合没有自行清理,所以我添加了行 model.collection.pop() 希望能解决它。

无效事件仍被触发 n 次。N 是我尝试创建新模型的次数,直到我重新加载应用程序。我发现如果传入的模型上有一个集合对象,我应该只显示错误消息。现在一切正常,但这似乎有点笨拙。

我尝试在无效事件方法中添加 model.stopListening() 。虽然没有运气。我认为这与我没有完全清理这些部分或无效模型有关。

createNewAsset: (event) ->
 @collection.on "invalid", (model, error) =>
      console.log "invalid fired"
      unless model.collection is undefined
        errView = new MyApp.Views.Error(collection: error)
        $("body").append(errView.render().el)
        model.collection.pop()

 @collection.on "sync", ->
   Backbone.history.navigate("assets", true)

 @collection.create 
   name: @$el.find("#new_asset_name").val()

澄清更新

上面的代码适用于最终用户,但我有一些僵尸模型或集合触发了 n 个事件。N 是用户点击保存按钮的次数。

4

1 回答 1

2

我不认为你的问题是你有流浪模型,你的问题是你"invalid"每次createNewAsset调用时都将一个新的匿名回调绑定到集合。

您应该只绑定一次"invalid""sync"处理程序initialize

initialize: ->
  # You could still use anonymous functions here.
  @listenTo(@collection, 'invalid', @bad_model)
  @listenTo(@collection, 'sync',    @synced)
  #...

bad_model: (model, error) ->
  console.log('invalid fired')
  #...

synced: ->
  Backbone.history.navigate('assets', true)

然后你createNewAsset就变成了这样:

createNewAsset: (event) ->
  @collection.create
    name: @$('#new_asset_name').val()

我还把你切换@$el.find()@$()了内置快捷方式的标准@$el.find

于 2013-05-14T01:15:10.150 回答