如何处理从backbone.js中的collection.create()触发的多个无效事件

How to handle multiple invalid events being fired from collection.create() in backbone.js

本文关键字:事件 无效 create 中的 处理 何处理 backbone js collection      更新时间:2023-09-26

我正在使用集合添加一个模型。创建方法。我已经重写了模型。方法和错误窗口弹出,我得到正确的错误消息。

一切似乎都很顺利,直到我第三次或第四次点击保存按钮。对于之前的每个无效模型,都会触发无效事件。我注意到,当无效事件触发时,集合本身并没有清理,所以我添加了一行model.collection.pop(),希望能解决这个问题。

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

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

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为用户点击保存按钮的次数

我不认为你的问题是你有流浪模型,你的问题是你绑定一个新的匿名"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的标准内置快捷方式。