2012-09-23 1 views
1

J'ai obtenu un objet médiateur qui gère les bacs à sable.Partage d'une instance de prototype via requirejs sans motif singelton?

Chaque bac à sable doit être enregistré auprès du médiateur. Parce que j'utilise aussi requirejs c'est un petit problème parce que je ne sais pas comment je pourrais partager l'instance et non le prototype:

mediator.js

define([], function() { 
    var Mediator = function() {}; 
    Mediator.prototype.start = function() {}; 
    Mediator.prototype.stop = function() {}; 
    Mediator.prototype.register = function() {}; 
    Mediator.prototype.unregister = function() {}; 
    return Mediator; 
}); 

sandbox_one.js

define(['mediator'], function(Mediator) { 
    var mediator = new Mediator(); 
    mediator.register('sandboxOne', SandboxObject); 
}); 

sandbox_two.js

define(['mediator'], function(Mediator) { 
    var mediator = new Mediator(); 
    mediator.register('sandboxtwo', SandboxObject); 
}); 

Comme vous l'avez mentionné avec l'approche actuelle, j'inscris les bacs à sable à deux médiateurs différents. Une idée pour résoudre cela serait l'utilisation d'un modèle singleton, mais cela est en conflit avec l'architecture et les recommandations requirejs ..

Alors, quelles sont les autres façons de laisser les sandbox enregistrer tous à la même instance de Mediator?

+1

Pouvez-vous expliquer un peu plus? Si vous utilisez la même instance partout, alors vous aurez un singleton de toute façon, peu importe comment vous l'appelez? – JohnB

Répondre

2

Puisque je ne peux pas poster de commentaires, je vais poster une réponse.

ggozad explique comment faire un singleton en RequireJS ici: Is it a bad practice to use the requireJS module as a singleton?

Son code:

define(function (require) { 
    var singleton = function() { 
     return { 
      ... 
     }; 
    }; 
    return singleton(); 
}); 
+4

Il n'y a aucune raison d'avoir cette fonction 'singleton' - juste retourner l'objet littéral – Bergi

+0

@Bergi fermeture? – ZenMaster

+0

@ZenMaster: Vous l'avez déjà avec la fonction anonyme pour 'define' ... – Bergi

0

En fait, avec RequireJS vous recevez déjà singletons, donc si vous appelez:

require(['mediator'], function(Mediator) { 
    .... 
}); 

Mediator sera toujours le même objet. S'il s'agit d'une fonction de constructeur, en appelant le new Mediator(), vous créez toujours une nouvelle instance, mais utilise la même fonction à chaque fois.

Mais vous ne devez pas retourner une fonction:

define([], function() { 
    return { 
     start: function() {}, 
     stop: function() {}, 
     register: function() {}, 
     unregister: function() {} 
    }; 
}); 

Maintenant, votre Mediator sera une instance, pas une fonction, et vous ne pouvez pas l'utiliser comme fonction. Vous êtes par exemple serait maintenant ressembler à:

require(['mediator'], function(Mediator) { 
    Mediator.register('sandboxOne', SandboxObject); 
}); 

Avertissement: J'utilise RequireJS version de build-in dans Dojo.

Questions connexes