2008-10-31 7 views
2

Vous ne savez pas si j'ai correctement formulé ce libellé, mais dans le rappel, comment puis-je référencer la propriété controls de la classe de base? Cela m'inquiète depuis un certain temps et je travaille habituellement autour de cela, mais je serais reconnaissant si quelqu'un peut m'éclairer sur la façon dont je devrais le faire correctement.Accès à la propriété parente dans le rappel jQuery

var base = function() { 
    var controls = {}; 

    return { 
     init: function(c) { 
      this.controls = c 
     }, 
     foo: function(args) { 
      this.init(args.controls); 
      $(this.controls.DropDown).change(function() { 
       $(this.controls.PlaceHolder).toggle(); 
      }); 
     } 
    } 
}; 

Une grande partie Obligatoire,

Paul

Répondre

2

Utilisez la puissance de fermeture:

var base = function() { 
    var controls = {}; 

    return { 
     init: function(c) { 
       this.controls = c 
     }, 
     foo: function(args) { 
       var self = this; 

       this.init(args.controls); 
       $(this.controls.DropDown).change(function() { 
         $(self.controls.PlaceHolder).toggle(); 
       }); 
     } 
    } 
}; 
+0

Génial, cela fonctionne parfaitement. Merci à tous ceux qui ont répondu. – bitsprint

1

Vous devez tirer parti de fermetures ici.

var base = function() { 
var controls = {}; 

return { 
    init: function(c) { 
      this.controls = c 
    }, 
    foo: function(args) { 
      this.init(args.controls); 
      $(this.controls.DropDown).change(function(controls) { 
        return function(){ 
         $(controls.PlaceHolder).toggle(); 
        } 
      }(this.controls)); 
    } 
} 

};

+0

me tabassaient un instant avec une solution plus élégante: D –

+0

Quelque chose de particulier semble se produire lorsque j'utilise cette approche. L'événement click se déclenche au chargement de la page. Je pense que cela a à voir avec le paramètre controls dans la fonction callback car quand j'enlève que l'évènement click ne se déclenche pas automatiquement. – bitsprint

+0

Quel événement de clic? –

2

Bien que closures sont preferred, vous pouvez également utiliser jquery bind pour passer un objet le long:

var base = function() { 
    var controls = {}; 

    return { 
     init: function(c) { 
      this.controls = c 
     }, 
     foo: function(args) { 
      this.init(args.controls); 
      $(this.controls.DropDown).bind('change', {controls: this.controls}, function(event) { 
       $(event.data.controls.PlaceHolder).toggle(); 
      }); 
     } 
    } 
}; 
+0

J'aime cette approche et j'imagine que si j'utilise intensivement jQuery dans tout mon code, je devrais utiliser la méthode bind. Je peux juste utiliser des fermetures pendant un moment pour que je m'habitue à l'utiliser et puis une fois familier je peux utiliser non plus. Merci. – bitsprint

Questions connexes