2010-06-19 5 views
0

dire que je suis arrivé avec cet objet singleton quelques méthodes publiques et une méthode privée:Comment implémenter un callback before_filter en javascript?

var QuestionFactory = (function() { 

// private method 
function google_it_first() { ... } 

// public methods 
return { 
    ask_a_stupid_question:    function() { ... }, 
    ask_a_relatively_non_stupid_question: function() { ... }, 
    ask_a_difficult_question:    function() { ... } 
} 

})(); 

Ce que je voudrais être en mesure de faire est d'appeler google_it_first méthode d'abord, lorsqu'une méthode publique est appelée. Comment l'implémenter sans l'appeler explicitement dans chaque méthode publique?

Répondre

2
function wrapper() { 
    return function() { 
    google_it_first(); 
    return arguments[0](arguments.slice(1,arguments.length); 
    } 
} 

ask_a_stupid_question: wrapper(function() { ... }) 

Du haut de ma tête, je pense que cela fonctionnerait.

+1

+1 Cela a été ma première pensée aussi, notez simplement que 'arguments' n'est malheureusement pas un objet * real array *, vous devez appeler la méthode' slice' sur l'objet 'Array.prototype' en utilisant' call'. E.g: 'var args = Array.prototype.slice.call (arguments, 1);', vous pouvez également utiliser 'apply' pour invoquer la fonction encapsulée et envoyer les arguments séparément, par ex. 'arguments [0] .apply (null, args);' – CMS

+0

Peut-être que je ne l'ai pas compris, mais il semble que je devrais utiliser la fonction wrapper sur chacune des méthodes. Qui est, en termes de duplication de code, est identique à l'appel de google_it_first() à l'intérieur de chacune de ces méthodes. Quel est le point alors? – snitko

+0

Oui, vous devriez le faire. La chose est que vous pouvez ensuite ajouter autant de fonctions à l'encapsuleur sans avoir à le changer pour toutes les méthodes. Je discuterais du fait que le mécanisme est assez différent en termes de duplication, car il sépare encore les aspects/préoccupations. Le fait est que c'est comme ça que fonctionne javascript. Before_filters in rails sont implémentés dans le système de requête plutôt qu'au niveau de la méthode. –

Questions connexes