2011-09-23 3 views
3

J'ai actuellement un problème avec javascript et python pour communiquer dans web2py.web2py: comment copier un tableau python dans un tableau javascript

contrôleur

:

def testDB(): 
     a=[] 
     a.append('a') 
     a.append('b') 
     a.append('c') 
     return dict(m=a) 

(Finalement, ce sera remplacé par un tableau de lignes DB) Actuellement, je suis en train d'affecter les valeurs m à un tableau en javascript. J'ai essayé ceci de quelques manières:

var t="{{=m}}"; 

Renvoie environ 43 caractères sans signification. Alors j'ai essayé:

var t= new Array(); var i=0;"{{q=0}}" 
"{{i=len(message)}}" 
i="{{=i}}"; 
for(q=0;q<i;q++,"{{q=q+1}}"){ 
t[q]="{{m[q]}}"; 
} 

Ce qui a échoué parce que la variable python q réinitialisait chaque fois que la boucle a fait, ce qui est le cœur de mon problème. J'ai aussi essayé d'utiliser la pop:

for(q=0;q<i;q++,"{{q=q+1}}"){ 
    alert("{{m.pop()}}"); 
    } 

Mais le tableau à nouveau remise à zéro motive le début de la boucle, il continue d'afficher la même variable. Existe-t-il un moyen plus simple de copier les tableaux, ou d'arrêter la réinitialisation des variables python, ou même simplement de brancher la variable javascript q dans "{{m [q]}}" à la place? D'après ce que j'ai trouvé, le problème vient de python étant côté serveur, donc vous ne pouvez pas attribuer des valeurs javascript à ses variables, mais je ne suis pas sûr de ce que cela a à voir avec la partie en boucle (Si Je fais de même en dehors d'une boucle, les valeurs ne sont pas réinitialisées). La solution commune semble être d'utiliser ajax ou json, mais j'aimerais éviter cela si possible. Merci

Répondre

2

Utilisez le module json:

>>> import json 
>>> s = json.dumps(range(5)) 
>>> print repr(s) 
'[0, 1, 2, 3, 4]' 
>>> print json.loads(s) 
[0, 1, 2, 3, 4] 
>>> 
+0

Et comment pourrais-je utiliser pour mettre les valeurs de m dans un tableau javascript? – James

+0

'json.dumps (py_list)' vous donnera un tableau JSON. Transmettez-le au navigateur. –

+0

Cela ne fonctionne pas avec web2py. Désolé de reconnaître que c'est un vieux fil. Je sentais que je devrais le mentionner cependant. J'ai essayé la même chose et vous obtenez '& quot' au lieu de guillemets dans la chaîne JSON dans la vue –

6

En web2py (ou toute autre langue de modèle côté serveur), vous ne pouvez pas mélanger le code Python côté serveur avec le code Javascript côté client la façon dont vous avez. Lorsque la page est demandée, le Python dans la vue web2py est évalué, et une page HTML pure (avec le code Javascript inclus) est générée et renvoyée au navigateur. Le navigateur n'obtient aucun code Python et ne peut pas exécuter un mélange de Javascript et de Python.

La vue web2py insère du texte/code uniquement dans la page lorsque vous avez {{=some_value}} (notez le signe égal). Ainsi, des choses comme {{m[q]}} n'ont aucun effet. Si vous voulez voir ce que le navigateur reçoit de web2py, regardez la source de la page dans le navigateur - il vous montrera le résultat final du HTML/Javascript généré par votre vue. Pour votre question particulière, vous pouvez utiliser response.json() pour convertir votre liste Python en un objet JSON. Cependant, si vous incluez tel quel dans la vue, il échappera à toutes les citations, vous devrez donc le passer au XML() helper pour éviter l'échappement. Quelque chose comme ceci:

var t = {{=XML(response.json(m))}} 
+0

Merci beaucoup, cela fonctionne parfaitement. Maintenant, je vais devoir comprendre comment l'obtenir pour accepter les lignes DB – James

1

Anthony's answer ne fonctionne pas sur web2py 2.9.12 ou au-dessus.

Pour attribuer une valeur variable python javascript varible, d'abord le convertir en JSON dans le contrôleur et passer ensuite à voir Et en vue, utilisez XML() pour l'assigner à javascript varible afin qu'il ne soit pas échappé

contrôleur

from gluon.serializers import json 

def index(): 
    array = [1, 2, 3, 4, 5] 
    dictionary = dict(id=1, name='foo') 
    return dict(array=json(array), dictionary=json(dictionary)) 

Voir

<script> 
    var js_array = {{=XML(array)}}; 
    var js_dictionary = {{=XML(dictionary)}}; 
</script> 

Autre solution est d'utiliser ASSIGNJS aide

Contrôleur

def index(): 
    array = [1, 2, 3, 4, 5] 
    dictionary = dict(id=1, name='foo') 
    return dict(array=array, dictionary=dictionary) 

Voir

<script> 
    {{=ASSIGNJS(js_array = array)}} 
    {{=ASSIGNJS(js_dictionary = dictionary)}} 
</script> 
+0

1plus pour la mention ASSIGNJS helper –

Questions connexes