【问题标题】:How to handle multiple invalid events being fired from collection.create() in backbone.js如何处理从backbone.js 中的collection.create() 触发的多个无效事件
【发布时间】:2013-05-14 00:14:52
【问题描述】:

我正在使用 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 是用户点击保存按钮的次数。

【问题讨论】:

    标签: javascript backbone.js event-handling backbone-events


    【解决方案1】:

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

    您应该在initialize 中绑定一次"invalid""sync" 处理程序:

    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 的标准内置快捷方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多