Testé l'existence d'un node avec un Id par R JS


#1

Bonjour,

Je suis en train de bidouiller pas mal avec RJS et je commence enfin à
en comprendre le fonctionnement et de facto à l’aimer. Mais
voilà,j’ai un comportement que je n’arrive pas à mettre en place.

Dans une page, j’ai un noeud avec un identifiant particulier, que
j’insére dans un autre noeud par la méthode :

page.insert_html :top, ‘noeud’, “

coucou

Au premier passage aucun problème. Mais je peux être amené à devoir
remplacer ce nouveaux noeud d’identifiant new avec le même template
RJS.

Donc je voudrais savoir comment testé l’existence ou pas d’un noeud
avec un identifiant précis.

J’ai vu que je pouvais faire :

page['new]

qui me renvoi un
#ActionView::Helpers::JavaScriptElementProxy:0xb727371c, mais je
n’ai pas trouvé la doc sur cette objet et donc les méthodes qui y sont
associées.

Merci de votre aide.


Cyril M.


#2

Cyril :

avec un identifiant précis.
côté serveur, je ne pense pas que ce soit possible.

J’ai vu que je pouvais faire :

page['new]

qui me renvoi un
#ActionView::Helpers::JavaScriptElementProxy:0xb727371c, mais je
n’ai pas trouvé la doc sur cette objet et donc les méthodes qui y sont
associées.

Je ne vois pas en quoi cette documentation pourrait t’aider.

Tu n’as pas un dialogue entre le serveur et le client, genre :

“- Cher client, ce DOM id existe-t-il ?”

  • Cher serveur, point du tout.
  • Ah dans ce cas, je vous balance ce RJS sous cette forme-là
    plutôt que celle-ci, faites-en bon usage.
  • Bien reçu, je l’exécute. Au plaisir"

C’est plutôt :

  • Tiens client, je te balance du RJS ou plutôt du JS généré
    par Rails, tu l’exécutes et ya intérêt que ça marche !
  • Ok chef.

La vérification si le dom id existe, je fais ci sinon je fais
ça doit se faire côté client et non côté serveur.

Quand le RJS est “dynamique”, ie des structures de
contrôleRuby ou des boucles :

genre :

@comments.each do |comment|
page[“comment-#{@comment.id}”].hide
end

if ma_condition
page.visual_effect …
else
page.replace_html…
end

Ces structures sont utilisées côté serveur.

Pour avoir du JS “dynamique” ie. avec des structures
de contrôle, tu utilises << , par exemple

page << “if ma_condition {”
page.replace_html …
page << “}”

page << “Try.these {”

page << “}”

Mais tu peux aussi appeler une fonction JS que t’as
défini dans application.js, qui vérifie l’existence du noeud
avant de faire telle opération, et tu l’appelles côté RJS
avec page.call

Bon, je sais plus ce que je voulais dire, mais je m’arrête
là pour le moment.

– Jean-François.


À la renverse.


#3

On 6/14/07, Jean-François removed_email_address@domain.invalid wrote:

Donc je voudrais savoir comment testé l’existence ou pas d’un noeud
avec un identifiant précis.

côté serveur, je ne pense pas que ce soit possible.

Si on peux le faire en faisant en JS :

if ($(‘new’) == undefined) {
}

Je ne vois pas en quoi cette documentation pourrait t’aider.

  • Tiens client, je te balance du RJS ou plutôt du JS généré
    par Rails, tu l’exécutes et ya intérêt que ça marche !
    page[“comment-#{@comment.id}”].hide
    Pour avoir du JS “dynamique” ie. avec des structures
    Mais tu peux aussi appeler une fonction JS que t’as
    défini dans application.js, qui vérifie l’existence du noeud
    avant de faire telle opération, et tu l’appelles côté RJS
    avec page.call

Bon, je sais plus ce que je voulais dire, mais je m’arrête
là pour le moment.

En faite, pour moi le RJS n’était qu’un utilitaire à créer du JS.
Donc, je voulais pas vérifier coté serveur si mon noeud était là, je
voulais créer une condition en JS. Donc si je comprend bien la
technique sera d’incorporer le JS directement dans mon objet page
comme cela :

page << if ($(‘new’) == undefined){
page.insert_html …
page << } else {
page.replace …
page << }

En tout cas merci de ton explication.


Cyril M.


#4

Le 14/06/07, Jean-François removed_email_address@domain.invalid a écrit :

C’est plutôt :

  • Tiens client, je te balance du RJS ou plutôt du JS généré
    par Rails, tu l’exécutes et ya intérêt que ça marche !
  • Ok chef.
J'aime voir clients et serveur discuter ensemble, quelle chaleur! :)

Vive Jean-François! \o/


#5

On 6/14/07, Cyril M. removed_email_address@domain.invalid wrote:

  • Ok chef.
    end
    de contrôle, tu utilises << , par exemple
    défini dans application.js, qui vérifie l’existence du noeud
    comme cela :

page << if ($(‘new’) == undefined){
page.insert_html …
page << } else {
page.replace …
page << }

En tout cas merci de ton explication.

Pour retour d’information, j’ai réussi à implémenter ce que je veux
avec le bout de code suivant :

page<< “if ($(‘errorExplanation’) == ‘undefined’){”
page.insert_html :top, ‘form_add’, '

coucou
"
page<< “} else {”
page.replace ‘new’, '
au revoir
"
page << “}”

Je met ce nouveau code, car celui-ci fonctionne et pas l’autre.


Cyril M.


#6

On 6/14/07, Sébastien Gruhier removed_email_address@domain.invalid wrote:

page.call
C’est mieux de mettre le code client dans des fichiers JS plutôt que de tout
mélanger dans le contrôleur. Déjà que le page :update met du code de la vue
dans le contrôleur (mais je trouve ça plus facile à lire que de faire des
.rjs pour une ou deux lignes), si en plus on y ajoute de la logique client!
Pas top.

Là il ne s’agit pas de mon controlleur, mais d’une vue. De plus RJS
génére tout simplement du JS pur, donc si j’écrivais une méthode JS
dans un fichier et que j’en fesais l’import, je me retrouverais avec
le même code que celui généré par mon RJS.

J’avoue ne pas trop savoir quel pourrait être les bonne pratique. Tout
ceci n’est que supposition pour moi effectivement.

Si vous avez une bonne doc sur les bonnes pratiques d’utilisation de
RJS, je suis preneur.


Cyril M.


#7

if ($(‘new’)) devrait suffir
Par contre ce genre de code
page<< “if ($(‘errorExplanation’) == ‘undefined’){”
page.insert_html :top, ‘form_add’, '

coucou
"
page<< “} else {”
page.replace ‘new’, '
au revoir
"
page << “}”

Je ne trouve pas ça très propre et comme le propose Jean-François, c
plus clean de faire une fonction dans une fichier .js et de l’appeler
avec un page.call
C’est mieux de mettre le code client dans des fichiers JS plutôt que
de tout mélanger dans le contrôleur. Déjà que le page :update met du
code de la vue dans le contrôleur (mais je trouve ça plus facile Ã
lire que de faire des .rjs pour une ou deux lignes), si en plus on y
ajoute de la logique client! Pas top.

Seb