2011-09-23 56 views
3

我目前有一個問題,獲取javascript和python在web2py中進行通信。web2py:如何將一個python數組複製到一個javascript

控制器:

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

(最終,這將被用DB行的陣列替換) 目前我試圖m中的值分配給在JavaScript的陣列。我試過這幾種方法:

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

返回約43個無意義的字符。然後我想:

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]}}"; 
} 

哪些失敗了,因爲蟒蛇q變量將每一次循環一樣,這是我的問題的心臟復位。 我使用的流行也試過:

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

但陣列保持在循環的開始再次重置,所以它一直顯示相同的變量。 有沒有更簡單的方法來複制數組,或者停止python變量重置,甚至是簡單地將javascript q變量插入「{{m [q]}}」來代替?

從我發現,問題來自於python作爲服務器端,所以你不能分配JavaScript值到它的變量,但我不知道它與循環部分有什麼關係(如果我在循環外做同樣的事,值不會重置)。常見的解決方案似乎是使用ajax或json,但如果可能的話,我想避免這種情況。由於

回答

2

使用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

我怎麼會用它來把m的值轉換爲JavaScript數組? – James

+0

'json.dumps(py_list)'會給你一個JSON數組。將它傳遞給瀏覽器。 –

+0

這不適用於web2py。對不起,認識到這是一個古老的線程。感覺我應該提及它。一直在嘗試相同的事情,你得到'而不是在視圖中的JSON字符串中的引號 –

6

在web2py中(或任何服務器端模板語言),你不能混用與客戶端Javascript代碼的服務器端Python代碼你的方式。當請求頁面時,將評估web2py視圖中的Python,並生成純HTML頁面(包含Javascript代碼)並將其返回給瀏覽器。瀏覽器沒有得到任何Python代碼,也不能執行Javascript和Python的混合。

當您有{{=some_value}}(注意等號)時,web2py視圖僅將文本/代碼插入到頁面中。所以,像{{m[q]}}這樣的東西沒有效果。如果您想查看瀏覽器從web2py收到的內容,請查看瀏覽器中的頁面源代碼 - 它會顯示您的視圖生成的HTML/Javascript的最終結果。

至於您的特定問題,您可以使用response.json()將您的Python列表轉換爲JSON對象。但是,如果您在視圖中包含該內容,它將會跳過所有引號,因此您必須將它傳遞給XML() helper以避免轉義。事情是這樣的:

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

感謝一堆,這完美的作品。現在我必須弄清楚如何讓它接受DB行 – James

1

Anthony's answer不上的web2py 2.9.12或以上的工作。

到Python變量值分配給的javascript varible,先將其轉換爲JSON在控制器,然後傳遞給查看 而在視圖中,使用XML()將其分配到的JavaScript varible以便它沒有逃脫

控制器

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)) 

查看

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

其他的解決方案是使用ASSIGNJS幫手

控制器

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

查看

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

1plus提到ASSIGNJS幫助器 –

相關問題