web2py A()链接处理多个目标

时间:2014-10-10 02:12:43

标签: ajax web2py

点击链接时我需要更新多个目标。 此示例构建链接列表。 单击链接时,回调需要填充.html文件的两个不同部分。

实际应用使用散景进行绘图。 用户将点击一个链接,'linkDetails1'和'linkDetails2'将保存脚本,div返回调用bokeh.component() 用户将单击一个链接,从bokeh的component()函数返回的脚本div将填充'linkDetails'。

显然这种天真的方法不起作用。 如何创建链接列表,单击该链接时将填充.html文件中的两个单独位置?

################################
#views/default/test.html:

{{extend 'layout.html'}}
{{=linkDetails1}}
{{=linkDetails2}}
{{=links}}

################################
# controllers/default.py:
def test():
    """
    example action using the internationalization operator T and flash
    rendered by views/default/index.html or views/generic.html

    if you need a simple wiki simply replace the two lines below with:
    return auth.wiki()
    """
    d = dict()
    links = []
    for ii in range(5):
      link = A("click on link %d"%ii, callback=URL('linkHandler/%d'%ii), )
      links.append(["Item %d"%ii, link])
    table = TABLE()
    table.append([TR(*rows) for rows in links])
    d["links"] = table
    d["linkDetails1"] = "linkDetails1" 
    d["linkDetails2"] = "linkDetails2" 
    return d

def linkHandler():
    import os
    d = dict()
    # request.url will be linked/N
    ii = int(os.path.split(request.url)[1])

    # want to put some information into linkDetails, some into linkDiv
    # this does not work:
    d = dict()
    d["linkDetails1"] = "linkHandler %d"%ii 
    d["linkDetails2"] = "linkHandler %d"%ii 
    return d 

2 个答案:

答案 0 :(得分:0)

我必须承认,我不是100%明确你要在这里做什么,但如果你需要更新,例如为了响应单击,页面中有2个div元素,有几种方法可以实现这一点。

最简单,也可以说是最web2py的方法是将目标包含在外部div中,该div是更新的目标。

另一个非常强大的替代方案是使用像Taconite [1]这样的东西,你可以用它来在一个响应中更新DOM的多个部分。

[1] http://www.malsup.com/jquery/taconite/

答案 1 :(得分:0)

在这种情况下,看起来您不需要Ajax调用将内容返回到DOM的两个独立部分。相反,返回的两个元素(脚本和div元素)可以简单地放在单个父div中。

# views/default/test.html:

{{extend 'layout.html'}}
<div id="link_details">
  {{=linkDetails1}}
  {{=linkDetails2}}
</div>
{{=links}}

# controllers/default.py
def test():
    ...
    for ii in range(5):
        link = A("click on link %d" % ii,
                 callback=URL('default', 'linkHandler', args=ii),
                 target="link_details")
    ...

如果为A()提供“目标”参数,则Ajax调用的结果将进入具有该ID的DOM元素。

def linkHandler():
    ...
    content = CAT(SCRIPT(...), DIV(...))
    return content

linkHandler中,您可以简单地返回一个web2py HTML帮助程序,它将自动序列化为HTML,然后插入到目标div中,而不是返回字典(需要视图才能生成HTML)。 。 CAT()帮助器简单地连接其他元素(在本例中,您的脚本和相关的div)。