2013-05-14 15 views
0

我正在使用collection.create方法添加模型。我已经覆盖了model.validate方法并弹出错误窗口,我得到了正确的错误消息。如何处理从backbone.js中的collection.create()触发的多个无效事件

一切似乎都很好,直到我第四次点击保存按钮三分之一。每个先前的无效模型都会触发无效事件。我注意到收集没有清理后无效事件发射,所以我添加了line.collection.pop()希望这将解决它。

无效事件仍然被关闭n次。 N是我重新加载应用程序之前尝试创建新模型的次数。我发现如果传入的模型上有一个集合对象,我应该只显示错误消息。现在一切正常,但是这看起来有点j。。

我试图在无效事件方法内添加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是用户点击保存按钮的次数。

回答

2

我不认为你的问题是你有流浪模型,你的问题是你每次调用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的捷径。

相关问题