2012-06-24 75 views
8

Flash消息的骨干是否存在扩展?它似乎是Web框架(服务器端至少)的一个常见功能。似乎没有,我试图做我自己的:BackboneJS Flash消息

class FlashMessenger extends Backbone.Model 

    constructor: -> 
     @messages = [] 

    # add a message to the messages array 
    add: (type, message) -> 
     @messages.push 
      type: type 
      message: message 

    # returns all existing messages and clearing all messages 
    getMessages: -> 
     ret = @messages.slice(0) 
     @messages = [] 
     return ret 

现在,我想知道如何将它们自动注入到我的意见。我会想我的消息显示,当我使用Backbone.Router.navigate()如:

app.flashMessages.add("success", "Successfully logged in") 
appRouter.navigate("dashboard") 
# flash messages should show when I render the view 

回答

13

我5毛钱 - 这似乎是有点矫枉过正的使用骨干闪光灯消息。如果您在页面上只有1个Flash消息实例,则最好不要使用单独的模型。

相反,我会用闪光灯消息的视图和一个全局调度:

Dispatcher = _.extend({}, Backbone.Events); 

创建视图:

var FlashMessage = Backbone.View.extend({ 
    initialize: function() { 
     Dispatcher.bind('show_flash_message', this.render); 
    }, 

    render: function(msg) { 
     // do something with the message 
    } 
}); 

而且从那里,你必须显示提示信息的应用程序的一部分,做

Dispatcher.trigger('show_flash_message', 'Some message'); 
+1

Woooaa。完善!我正在寻找这种解决方案。 +1 –

+0

太棒了!你能解释为什么你克隆'Backbone.Events',不使用现有的对象? – skalee

+0

首先,你不克隆它,你用它扩展一个空的对象,例如如上所述或'var Dispatcher = Backbone.Events.extend({});'因为所有的Backbone contstructor似乎都有内置的'extend'方法。至于为什么要创建另一个对象而不是使用Backbone.Events - 我会说,因为你不想改变框架,作为一个规则,创建一个Dispatched对象可能以后需要添加自定义方法。 IMO这种方式只是更清洁。 –