Transport d'objet ? [Ajax] - HTML/CSS - Programmation
Marsh Posté le 20-04-2007 à 09:50:47
Perso pour eviter ce genre de soucis , j'evite de me servir de this!
Code :
|
Marsh Posté le 20-04-2007 à 10:01:16
Depuis le temps que je galère là dessus, tu viens de m'enlever une énorme épine du pied
Marsh Posté le 20-04-2007 à 10:29:19
Arg, ya un p'ti soucis avec self.
Comment faire lorsque tu as 2 instances du composant dans ta page ?
Marsh Posté le 20-04-2007 à 10:46:47
le coup du this, c'est un problème classique de "binding". La librairie prototype dispose d'une fonction qui permet de régler ce pb. Je l'avais lu dans ce bouquin : http://www.amazon.fr/Bien-d%C3%A9v [...] 730&sr=8-1
Mais je ne l'ai pas sous la main là, je ne peux donc pas te donner le code qui va bien. Peut-être que dans las doc de prototype, tu vas trouver à "bind" ou "binding"...
Marsh Posté le 20-04-2007 à 10:49:34
J'ai vu quelques exemples de bind (en regardant le framework de rico) mais j'ai du mal à comprendre comment ça marche et donc comment l'utiliser
Marsh Posté le 20-04-2007 à 11:17:18
magicien96 a écrit : Arg, ya un p'ti soucis avec self. Comment faire lorsque tu as 2 instances du composant dans ta page ? |
C'est parce que j'ai écrit nawak que ça marche pas, le self = this devrait être dans ton constructeur.
Sauf que la, je l'ai foutu dans le prototype.
A vue de nez avec ton code ça donnerait:
Code :
|
Et il n'y a plus de raison pour qu'il y ait de problèmes, même avec 400 objets de la même classe dans ta page.
edit: Et fait bien gaffe dans le "new Ajax.Request" c'est bien this qu'il faut laisser pour que cela pointe sur ton objet xhr. Si tu mets self ça va pointer sur ton objet component.
Marsh Posté le 20-04-2007 à 11:19:03
Autres soucis supplémentaire:
Avec :
handler(req) { |
self.ar a la bonne valeur
Par contre, si je fais:
handler(req) { |
autreFonction n'est pas appellé
Je suis toujours preneur pour des infos de l'utilisation de bind aussi....
Marsh Posté le 20-04-2007 à 11:23:22
Mais c'est normal, autreFonction n'est pas une méthode de ta classe component...
Je sens que tu galères bien avec les classes en js
Je te conseille la lecture de ces trois tuts que je trouve extremement bien fait:
http://phrogz.net/JS/Classes/OOPinJS.html ( les bases des classes)
http://phrogz.net/JS/Classes/OOPinJS2.html ( héritage)
http://phrogz.net/JS/Classes/Exten [...] asses.html ( ajout de methodes/propriétés dynamiquement)
Marsh Posté le 20-04-2007 à 11:28:11
anapajari a écrit : C'est parce que j'ai écrit nawak que ça marche pas, le self = this devrait être dans ton constructeur. |
J'avais déjà bien mis "var self = this" dans l'initialize
En gros le soucis. Dans ma page html je fais:
var composant = new Composant("jesuisleroot", new Array('1', '2')); |
et lorsque je fais
handler(req) { |
J'ai 2 popup qui s'affiche avec comme contenu "jesuisunautreroot" (le premier aurait du contenir "jesuisleroot" )
Marsh Posté le 20-04-2007 à 11:36:11
anapajari a écrit : Mais c'est normal, autreFonction n'est pas une méthode de ta classe component... |
Nonon, autreFonction est bien une méthode de ma classe (je factorise la méthode du code, c'est pour ça qu'il y a qqs oublis )
Framework.TreeView.prototype = { |
Et le popup here n'apparait pas...
Marsh Posté le 20-04-2007 à 11:36:33
tu devrais passer self en paramètre de ton oncomplete et tu n'aurais plus de soucis ... Plus exactement définir handler comme une méthode de ta classe
Code :
|
Parce que là c'est quand même super pas logique car la méthode handler est appelé par un objet (xhr) qui n'est pas de sa classe (component)
Edit: Si tu disais tout depuis le début ça irait plus vite aussi
Donc le var self=this faut le mettre dans toutes les méthodes de ta classe sinon ça merdouille. Ou alors continuer à se servir de this dans les méthodes. Self n'est necessaire que lorsque l'objet est passé en paramètre en dehors de la classe ( ce qui est le cas lors du retour de xhr).
Note bien le this dans ce cas là:
Code :
|
Marsh Posté le 20-04-2007 à 11:46:47
anapajari a écrit :
|
Désolé, j'ai été trop vite pour mon premier message...
Je test ta solution...
Marsh Posté le 20-04-2007 à 12:02:06
magicien96 a écrit : Désolé, j'ai été trop vite pour mon premier message... |
Ca a l'air de bien fonctionner Autant pour l'appel des bonnes fonctions que pour des instances multiples.
Je repasserais en cas de soucis
Merci en tout cas
Marsh Posté le 26-06-2007 à 16:08:16
Depuis le debut tu avais raison, ton code était bon, il suffit juste de faire
new Ajax.Request("/url",
{
method: 'get',
parameters: this.getQueryString(this.idRoot),
onComplete: this.handler.bindAsEventListener(this)
}
donc d'utiliser bindAsEventListener pour recuperer ton objet dans this
Marsh Posté le 20-04-2007 à 09:35:56
Bonjour
Petit (gros ?) soucis d'utilisation d'ajax et des objets en javascript :
Ma page html créé un nouveau composant.
var composant = new Composant("jesuisleroot", new Array('1', '2'));
Celui ci fait un appel ajax via le framework de prototype. Je fais appel à une seconde fonction lorsque le xhr est terminé.
composant.prototype {
initialize: function(idRoot, ar) {
this.ar = ar;
this.include = idRoot;
new Ajax.Request("/url",
{
method: 'get',
parameters: this.getQueryString(this.idRoot),
onComplete: handler
}
);
},
handler(req) {
autreFonction(this.ar, req.responseXML);
}
}
Cette ligne pose problème :
autreFonction(this.ar, req.responseXML);
Car this n'est plus mon objet mais l'élément Window...
Ma question est donc comment récupérer mon objet à cet endroit ?
Message édité par magicien96 le 20-04-2007 à 09:43:36
---------------
Ils ne savaient pas que c'était impossible, alors ils l'ont fait. ©Mark Twain