2013-12-17 70 views
1

我正在爲我的網頁中的評論添加ajax。 以下是功能和視圖文件web2py中的ajax響應

def normalajax(): 
    news=db(db.newsfeed.id>0).select(orderby=~db.newsfeed.created_on) 
    return dict(news=news) 

def new_post(): 
    form=SQLFORM(db.newsfeed) 
    if form.accepts(request.vars, formname=None): 
     news=db(db.newsfeed.created_by==auth.user_id).select(orderby=~db.newsfeed.created_on) 
     return DIV(news) 
    elif form.errors: 
     return TABLE(*[TR(k, v) for k, v in form.errors.items()]) 


{{extend 'layout.html'}} 

<form id="myform"> 
    <input name="body" id="body" /> 
    <input type="submit" /> 
</form> 
<script>$('textarea').css('width','600px').css('height','50px');</script> 

<script> 
jQuery('#myform').submit(function() { 
    ajax('{{=URL('new_post')}}', 
     ['body'], 'target'); 
    return false; 
}); 

</script> 

<div id="target"> 
{{for post in news:}} 
<div style="background: #ffffff; margin-bottom: 5px; padding: 8px;"> 
<h3>{{=db.auth_users[post.created_by].first_name}}</h3> On {{=post.created_on}}: 
    {{=MARKMIN(post.body)}} 

</div>  
{{pass}} 

</div> 

的問題是,當我發表新評論,整個DIV被新的內容所取代,沒有它我在給for循環中的所有造型

我已經給了截圖的鏈接: 這是張貼評論之前: https://skydrive.live.com/redir?resid=AFF5DF0EB4A5BCD5!122&authkey=!AFg6utSsGLyYRG4&v=3&ithint=photo%2c.png

這是張貼評論後: https://skydrive.live.com/redir?resid=AFF5DF0EB4A5BCD5!123&authkey=!AJyroKLQLp5ssPs&v=3&ithint=photo%2c.png

發佈評論後,Ajax響應替換DIV目標,如何訪問響應並顯示它像它在發佈前dislayed的內容...

回答

2

一旦該頁面在瀏覽器中,你不能在它執行Python代碼。一旦頁面位於瀏覽器中,原始模板中的Python代碼就不存在 - 全部執行該代碼以生成純HTML源代碼。當您提交表單時,new_post函數返回DIV(news),該函數將轉換爲HTML。該HTML替換頁面上「目標」div的內容。當您生成Ajax響應時,必須在服務器上生成最終的HTML並將其發送到瀏覽器 - 瀏覽器不執行任何模板處理。

在任何情況下,更好的方法可能是使用Ajax組件。沒測試過,但類似:

def news(): 
    return dict() 

def news_list(): 
    if request.args(0) == 'user': 
     query = db.newsfeed.created_by == auth.user_id 
    else: 
     query = db.newsfeed.id > 0 
    news = db(query).select(orderby=~db.newsfeed.created_on) 
    return dict(news=news) 

def new_post(): 
    form = SQLFORM(db.newsfeed) 
    if form.process().accepted: 
     url = URL('default', 'news_list.load', args='user') 
     response.js = "$.web2py.component('%s', target='news');" % url 
    return dict(form=form) 

In /views/default/news.html: 

{{extend 'layout.html'}} 
{{=LOAD('default', 'new_post.load', ajax=True)}} 
{{=LOAD('default', 'news_list.load', ajax=True, target='news')}} 

In /views/default/news_list.load: 

{{for post in news:}} 
<div style="background: #ffffff; margin-bottom: 5px; padding: 8px;"> 
<h3>{{=post.created_by.first_name}}</h3> On {{=post.created_on}}: 
    {{=MARKMIN(post.body)}} 
{{pass}} 

In /views/default/new_post.load: 

{{=form}} 

在上面的代碼,news.html是主要的頁面,它包含兩個Ajax組件 - 一個用於表單,一個用於新聞列表。最初,新聞列表組件會加載所有新聞帖子(如果有許多帖子,您可能會考慮限制該帖子或分頁)。表單提交後,它會通過response.js返回一些Javascript,並在成功提交後執行。 Javascript在瀏覽器中調用$.web2py.component(),它通過調用news_list()函數以「user」作爲URL參數來重新載入「news」div中的新聞列表組件(「user」arg是一個標誌,它告訴news_list()函數僅返回當前用戶的帖子)。

+0

嘿,我試着使用上面的代碼,但新的價值並沒有得到顯示,雖然它正在提交和顯示當我重新加載頁面,感謝您的幫助!...我想再問一件事,我們可以在另一個組件中添加一個組件,如果我們可以在嵌套組件內部的表單被提交時,外部組件是否會刷新? ...再一次,非常感謝您的幫助! –

+0

上面的代碼適用於我(新值立即顯示,只要created_by值是當前登錄用戶的ID)。如果你觀察到不同的東西,那很可能是因爲你以某種方式改變了代碼。(注意,我確實糾正了上面的一些錯別字,但它們會產生異常,而不是你觀察到的行爲。)。 – Anthony

+0

是的,我相信你應該能夠嵌套組件,但是當嵌套組件中的表單被提交時,它不會刷新外部組件。上面的例子是一個更好的方法。 – Anthony

0

適用相同的CSS的Ajax響應得到了同樣的觀點

此css從ajax響應中丟失。

鑑於這個例子

$.ajax({ 
    url: "test.html", 
    cache: false 
}) 
.done(function(result) { 
$("#results").append(result); // or replace your "result" coming from server 
}); 
+0

但我如何訪問ajax響應,它正在替換整個div的內容? –

+0

請再次閱讀這個問題 –