Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    View Cyril Durand's profile on LinkedIn

    hit counters

Quizz JavaScript : objet et abonnement d'evenement

Encore un problème d'abonnement d'évenement. Voici un contrôle utilisant la syntaxe Atlas qui ne fait que créer un bouton et s'abonner à son événement click pour afficher la propriété foo du contrôle.

Type.registerNamespace('CS.UI'); CS.UI.MonControl = function(element){ CS.UI.MonControl.initializeBase(this, [element]); } CS.UI.MonControl.prototype = { _foo : null, _button : null, get_foo : function(){ return this._foo; }, set_foo : function(value){ this._foo = value; }, initialize : function(){ CS.UI.MonControl.callBaseMethod(this, 'initialize'); this._createDom(); }, dispose : function(){ CS.UI.MonControl.callBaseMethod(this, 'dispose'); $clearHandlers(this._button); }, _createDom : function(){ this._button = document.createElement('button'); this._button.appendChild(document.createTextNode('button')); $addHandler(this._button, 'click', this._btnclick); // même problème en utilisant btn.onclick = this._btnclick; this._element.appendChild(this._button); this._element.appendChild(document.createElement('br')); }, _btnclick : function(){ this._dummyMethod(); // Ligne 84 : l'erreur se trouve ici }, _dummyMethod : function(){ Sys.Debug.trace('foo vaut : ' + this._foo); } } CS.UI.MonControl.registerClass('CS.UI.MonControl', Sys.UI.Control); $create(CS.UI.MonControl, { 'foo' : 'je suis foo' }, {}, null, $get('div1')); // équivalent à // var o = new CS.UI.MonControl($get('div1')); // o.set_foo('je suis foo'); // o.initialize();

Lorsque l'on click sur le bouton on obtient une erreur :

Untitled

Le code intéressant se trouve au niveau de la méthode _createDom et _btnClick, tout le reste n'est que la plomberie lié à la création de contrôle via Microsoft Ajax library.

Alors, comment corriger ce problème ?

Posted: dimanche 12 août 2007 18:37 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

simon ferquel a dit :

Je vois 2 solutions :

Function.createDelegate(...) pour appeler _btnClick dans le bon context, et une solution plus générique (pas besoin d'Atlas):

var thisCtrl = this;

btn.onclick = function()

{

  thisCtrl._btnClick();

}

# août 12, 2007 21:48

cyril a dit :

wahouuu ! finalement tu sais faire du js ;-)

et sans utiliser Atlas mais en gardant le this._btnClick() ? comment qu'on pourrais faire ?

# août 12, 2007 22:04

simon ferquel a dit :

Ca je sais pas, à la base je suis développeur, pas web master :p

# août 13, 2007 09:05

FREMYCOMPANY a dit :

Comme je connais pas ATLAS, je m'abstient de proposer des solutions ALTAS mais pour répondre à "et sans utiliser Atlas mais en gardant le this._btnClick() ? comment qu'on pourrais faire ? ", je pense à apply/call...

Sinon oui, moi j'ai développé Function.prototype.toDelegate (qui joue avec apply justement) dans mon framework donc j'aurais fait comme ca : this._btnOnClick.toDelegate(this);

# août 13, 2007 11:11

Erebuss a dit :

HiHiHi

J'adore ta réponse Simon ^^

# août 13, 2007 11:11

FREMYCOMPANY a dit :

CODE simplifié de Function.prototype.toDelegate : function(baseObject) { var f=this; return function() { f.apply(baseObject, arguments); }}

# août 13, 2007 11:13

cyril a dit :

quoi ? insinues tu que faire du javascript ce n'est pas du developpement ?

Ce qui faut pas entendre :p

oui il faut passer par les méthodes apply et call, mais comment ?

# août 13, 2007 11:14

FREMYCOMPANY a dit :

@cyril : J'ai posté le code de ma fonction toDelegate, ca montre le principe, ensuite, on peut l'adapter pour la rendre approprié au cas qui nous intéresse :

var f=this._btnOnClick;

... (function(baseObject) { return function() { f.apply(baseObject, arguments); }})(this) ...;

# août 13, 2007 11:29

cyril a dit :

arf oui, j'avais pas vu, t'as posté ton comment 1 minute avant le mien :-)

# août 13, 2007 11:47

coq a dit :

"quoi ? insinues tu que faire du javascript ce n'est pas du developpement ?"

beeeeeeeen

Que quelqu'un éloigne aurel de ce post :p

# août 13, 2007 11:51
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- La même chose en TPT par Matthieu MEZIL le il y a 7 minutes

- L'injection SQL n'est PAS un problème QUE pour les développeurs web ! par CoqBlog le il y a 1 heure et 2 minutes

- Un outil pour réaliser des animations WPF basées sur des équations de Bézier par Perspective le il y a 4 heures et 26 minutes

- Sandcastle et CodePlex : le verdict par CoqBlog le il y a 5 heures et 17 minutes

- ssdl view and TPH par Matthieu MEZIL le il y a 6 heures et 59 minutes

- Webcasts sur le Parallel Framework disponibles par Matthieu MEZIL le il y a 8 heures et 45 minutes

- [Silverlight] - Comprendre et Débuter avec Silverlight par Danuz le il y a 13 heures et 30 minutes

- SharePoint : Nouvel article sur l'exportation et Importation de sites SharePoint par Blog Technique de Romelard Fabrice le 07-04-2008, 01:00

- ImagineCup 2008 Final in Paris: Day 1 par Richard Clark le 07-03-2008, 22:48

- PowerShell : Comment utiliser un ENUM .NET dans un script PowerShell par Blog Technique de Romelard Fabrice le 07-03-2008, 18:09