2012-09-13 13 views
16

Ich habe eine Reihe von Backbone-Modellen, die in Sammlungen organisiert und mit ihren entsprechenden Ansichten und/oder Sammlungen von Ansichten verbunden sind. Einige dieser Modelle, die nicht zu derselben Sammlung gehören, müssen ein Ereignis auslösen, das für ein anderes Modell (und möglicherweise mehrere) von Interesse ist.backbone.js + globaler Event-Dispatcher + require.js: Anleitung?

Der empfohlene Weg, um damit umzugehen, ist, denke ich, der "globale Event Dispatcher/Aggregator" wie beschrieben here und andere Orte.

Allerdings verwende ich auch require.js, was gegen die Idee scheint, den Dispatcher/Aggregator an das Namespace-Objekt der Anwendung anzuhängen - oder irre ich mich hier?

Also meine Frage ist: mit require.js Wie kann ich eine Reihe von verschiedenen Backbone-Modelle auslösen ein Ereignis, das von einem anderen Modell behandelt wird?

Antwort

35

Eine ähnliche Lösung zu dem, was @Andreas p roposiert, aber ohne Backbone.Marionette (stark inspiriert, see the article linked in the question).

Sie müssen lediglich ein Modul definieren, das ein Singleton eines Ereignis-Listeners erstellt und dieses Objekt in den Modulen benötigt, an denen Sie ein Ereignis auslösen oder dieses Ereignis anhören möchten.

Angenommen, Sie app/channel.js Definition Ihrer Kanal

define(['backbone', 'underscore'], function (Backbone, _) { 
    var channel = _.extend({}, Backbone.Events); 
    return channel; 
}); 

Sie können dann verwenden Sie es als Zuhörer über

require(['app/channel'], function (channel) { 
    channel.on('app.event', function() { 
     console.log('app.event'); 
    }); 
}); 

und Sie können ein Ereignis auslösen, auf Dieser Kanal über

require(['app/channel'], function (channel) { 
    channel.trigger('app.event'); 
}); 
+0

Ich denke, dass das ist, was ich gesucht habe. Vielen Dank nikoshr and andreas – alearg

+0

Was ist der Vorteil der Verwendung von Ereignissen in dieser Situation? Wir müssen immer noch "app/model" in alle Module einfügen, wo wir dieses Ereignis auslösen werden. Warum nicht einen Api Anruf auf diesem Modell machen? – wizardzloy

+1

@wizardzloy Das einzige Modul, das Sie hinzufügen müssen, ist 'app/channel', wo Sie ein globales Ereignis anhören oder auslösen möchten. 'app/model' dient nur dazu, eine Beispielnutzung zu demonstrieren. – nikoshr

1

Wir verwenden Marionetten app.vent (das ist der globale Ereignissender für unsere Anwendung), allong mit erfordern js und es funktioniert wirklich gut.

app

define(, function(){ 
    return new Backbone.Marionette.Application(); 
}) 

Modell1

define(['app'], function(app){ 
    return Backbone.Marionette.Model.extend({ 
    initialize: function(){ 
     this.bindTo('app.vent', 'create:model2', this.toSomething, this); 
    } 
    }) 
}) 

Model2

define(['app'], function(app){ 
    return Backbone.Marionette.Model.extend({ 
    initialize: function(){ 
     app.vent.trigger('create:model2', this); 
    } 
    }) 
}) 
+0

Gut zu wissen, dass Marionette mit require.js in Ordnung ist. Gibt es jedoch keine Lösung für das Problem, die keinen zusätzlichen/alternativen Rahmen beinhaltet? – alearg

+0

Es gibt eine Reihe von Lösungen. Ich kann PubSubJS beraten: https://github.com/mroderick/PubSubJS –

+0

Danke für Ihren Vorschlag, ich werde es mir ansehen. Aber gibt es keine Lösungen, die keinen _ zusätzlichen Rahmen enthalten? – alearg