2016-10-05 42 views
0

我想在視圖/ div中包含搜索功能作爲組件,以便在不同視圖中重用它。爲此,我使用一個類似於reference manual中描述的wiki頁面搜索的ajax回調生成結果列表進行搜索。web2py:Ajax回調搜索功能作爲一個組件(LOAD)

# for standalone search 
# @auth.requires_login() 
# for seach as a component 
@auth.requires_signature() 
def search(): 
    model_id = request.args(0,cast=int) 
    form = FORM(T('Node Criteria: '), INPUT(_id='keyword',_name='keyword', 
                 _onkeyup="ajax('callback', ['keyword'], 'nodes_in_model_result_div');")) 

    # for standalone search 
    # target_div =DIV(_id='nodes_in_model_result_div') 

    return dict(form=form) #, target_div=target_div) 


def callback(): 
    if (request.vars.keyword==''): 
     query = db.node.title 
    else: 
     query = db.node.title.contains(request.vars.keyword) 

    nodes = db(query).select(db.node.id, db.node.title, orderby=db.node.title) 
    table = [TR(node.id, node.title) for node in nodes] 

    return TABLE(THEAD(TR(TH('Node ID', _width="30%"), TH('Node'), _height="5")), 
      TBODY(*table), 
      _class='table table-bordered table-striped', _cellspacing="0", _width="100%", _id='nodes_in_model_table') 

當搜索單獨使用(serach.html)時,一切正常。但作爲通過LOAD嵌入的成分(search.load)()如下所述搜索不起作用:然後

{{=LOAD('default','search.load', args=[model_id], target='nodes_in_model_div', ajax=True, user_signature=True)}} 

相關的DIV是在調用視圖中定義。所述search.load僅由{{=形式}},其中search.html如下:

{{extend 'layout.html'}} 
<h1>Search Node</h1> 
{{=form}} 
<br> 
{{=target_div}} 

是否有人知道如何嵌入到的web2py部件使用Ajax回調本身是一個功能?

問候 克萊門斯

+0

請解釋一下你的意思是「沒有按沒有工作「。另外,我們可能需要查看(至少)控制器代碼。 – Anthony

+0

Hello Anthony,'不起作用'意味着,當onkeyup事件應該觸發它時,顯示搜索條件的輸入字段,但不顯示結果列表(作爲表)。由於控制器代碼太長,無法將其放入評論中,因此我正在編輯問題帖子。 – Clemens

+0

更新: 效果似乎更一般。它也出現在參考手冊的wiki搜索示例中(http://web2py.com/books/default/chapter/29/03/overview#A-simple-wiki)。當您用任何參數(.../search/1)擴充搜索頁面時,搜索不再起作用。 (def search(): 「」「ajax wiki搜索頁面」「」 this_page = db.page(request.args(0,cast = int))或重定向(URL('index' )) return dict(form = FORM(INPUT(_id ='keyword',_ name ='keyword',_onkeyup =「ajax('callback',['keyword'],'target');」)),target_div = DIV(_id ='target'))' – Clemens

回答

1

不幸的是,書中例子錯誤。

_onkeyup="ajax('callback', ['keyword'], 'nodes_in_model_result_div');" 

在你上面的代碼,'callback'是一個相對的URL,因此它被附加到父頁面的URL。相反,你必須提供完整的URL路徑,你應該與URL()幫手做:

_onkeyup="ajax('%s', ['keyword'], 'nodes_in_model_result_div');" % URL('default', 'callback') 

在呈現的HTML,這將是這樣的:

onkeyup="ajax('/default/callback', ['keyword'], 'nodes_in_model_result_div');" 
+0

謝謝Anthony!這是解決方案!也許你可以給我一個提示,除了關鍵字外,如何傳遞進一步的參數到回調函數(在我的例子中,model_id是調用搜索函數的request.args(0,cast = int))?最好的問候,Clemens – Clemens

+0

'URL('default','callback',args = [request.args(0)])' – Anthony

+0

好吧,那很容易!非常感謝! – Clemens