2012-01-19 21 views
0

我有一個相對簡單的Backbone處理消息容器。我可以添加消息,並且它們顯示正常,但自動添加延遲以關閉消息不起作用,因爲undefined傳遞給回調。_.delay從一個Backbone.View事件處理程序調用

有人能告訴我如何正確指定參數被調用?主線是_.delay(function(){ messages.remove(this.model) }, 3000);

var Message = Backbone.Model.extend({ 
    defaults: { 
     message: 'No message', 
     type: 'error' 
    }, 

    /*validate: function(attrs) { 
     if (!attrs.type in ['error', 'warning', 'success', 'info']) { 
      return 'Wrong message type given'; 
     } 
    }*/ 
}); 
var Messages = Backbone.Collection.extend({ 
    model: Message 
}) 
var messages = new Messages; 

var MessageView = Backbone.View.extend({ 
    template: Handlebars.compile($('#t-message').html()), 

    initialize: function() { 
     messages.bind('delete', this.remove, this); 
    }, 

    render: function(event) { 
     $(this.el).html(this.template(this.model.toJSON())); 
     // TODO: this never fires properly 
     _.delay(function(){ messages.remove(this.model) }, 3000); 
     return this; 
    } 

}); 

var MessageContainerView = Backbone.View.extend({ 
    id: 'messages', 
    initialize: function() { 
     messages.bind('add', this.addMessage, this); 
    }, 
    render: function(event) { 
     return this; 
    }, 
    addMessage: function(message) { 
     var view = new MessageView({model: message}); 
     $('#' + this.id).append(view.render().el); 
    } 
}); 

var messagecontainerview = new MessageContainerView; 
messages.add(new Message({message: 'Close this in 3 secs.', type: 'success'})) 

當然this.model是渲染方法中定義的,但它在remove通話不確定的。

回答

3

這是因爲this綁定到什麼是調用延遲迴調函數,而不是視圖。致電_.delay之前分配var self=this;然後在回調函數中使用self.model

+0

你也可以使用['_.bind'](http://documentcloud.github.com/underscore/#bind),但這對於一個這樣的簡單例子來說可能是過度的。 –

相關問題