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

Ajax web2py A()链接处理多个目标,ajax,web2py,Ajax,Web2py,我需要在单击链接时更新多个目标。 本例构建了一个链接列表。 单击链接时,回调需要填充.html文件的两个不同部分 实际应用程序使用bokeh进行打印。 用户将单击一个链接,“linkDetails1”和“linkDetails2”将保存脚本和调用bokeh.component()返回的div 用户将单击一个链接,从bokeh的component()函数返回的脚本div将填充“linkDetails” 显然,这种幼稚的方法行不通。 我如何创建一个链接列表,当单击这些链接时,它们将填充.html文件

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

实际应用程序使用bokeh进行打印。 用户将单击一个链接,“linkDetails1”和“linkDetails2”将保存脚本和调用bokeh.component()返回的div 用户将单击一个链接,从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 

我必须承认,我不是100%清楚您在这里尝试做什么,但是如果您需要更新页面中的例如2个div元素以响应一次单击,有几种方法可以实现这一点

最简单的,也可以说是最具web2py风格的方法是将您的目标包含在作为更新目标的外部div中

另一种非常强大的替代方法是使用Taconite[1]之类的东西,您可以使用它在一个响应中更新DOM的多个部分


[1]

在本例中,似乎不需要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")
    ...

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

如果向
a()
帮助程序添加“target”参数,则Ajax调用返回的HTML将插入ID与“target”匹配的HTML元素中。如果您还想在另一个元素中添加一些内容,您可以编写一些Javascript代码来处理这些内容,并通过
response.js
返回Javascript。但是,您不清楚要将哪些内容放在何处,因为您既没有显示视图代码,也没有解释返回的元素中的两个linkDetails键应该发生什么如果你能展示视图代码并更明确地表达你想要的输出,那会有帮助。安东尼,视图代码在代码列表的顶部。点击A()link将更新linkDetails1和linkDetails2两个字段中的信息。这是一个精简的测试程序。在真实的应用程序中,链接将显示不同的bokeh绘图。bokeh的绘图代码返回一个带有随机id的div和一个引用该id的脚本。我希望这更清晰。是的,但在视图中,没有linkDiv,并且两个linkDetails项目只是文本节点,因此很难准确理解您试图实现的目标。此外,您还没有显示linkHandler的视图。要创建Bokeh图,您需要返回HTML或JS代码吗?linkDiv中包含哪些内容(以及linkDiv是什么/在哪里)?很抱歉,linkHandler中的注释错误。我希望将两个文本节点替换为分别为脚本和div的文本。
code
def linkHandler():导入操作系统d=dict()d[“linkDetails1”]=“d[“linkDetails2”]=”return dI尝试将目标放在外部div中,我得到的是div中整个页面(菜单、所有内容)的另一个副本。奇怪的是,一定是做错了什么。如果没有linkHandler的视图,默认情况下(仅在localhost上),它将使用generic.html视图,该视图扩展了整个布局。
def linkHandler():
    ...
    content = CAT(SCRIPT(...), DIV(...))
    return content