2014-10-10 3 views
0

Мне нужно обновить несколько целей при щелчке ссылки. В этом примере создается список ссылок. Когда ссылка нажата, обратный вызов должен заполнить две разные части .html-файла.Обработка ссылок web2py A() с несколькими целями

Фактическое приложение использует боке для печати. Пользователь будет нажимать на ссылку, 'linkDetails1' и 'linkDetails2' проведут скрипт и div возвращаются из вызовов на bokeh.component() Пользователь нажимает на ссылку, а скрипт div возвращается из компонента bokeh() будет заполнять '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 
+0

Если вы добавите «целевой» аргумент в помощник 'A()', HTML, возвращаемый вызовом Ajax, будет вставлен в элемент HTML, чей идентификатор соответствует «target». Если вы хотите добавить некоторый контент в другой элемент, вы можете написать код Javascript для его обработки и вернуть Javascript через 'response.js'. Однако неясно, что вы хотите поместить туда, поскольку вы не указали свой код представления и не объяснили, что должно произойти с двумя ключами linkDetails в возвращаемом dict. Это помогло бы, если бы вы могли показать код представления и более четко указать желаемый результат. – Anthony

+0

Anthony, код просмотра находится в верхней части списка кодов. Щелчок по ссылке A() должен обновить информацию в двух полях linkDetails1 и linkDetails2. Это урезанная тестовая программа. В реальном приложении ссылки будут отображать разные графики боке. Код построения bokeh возвращает div с случайным идентификатором и скриптом, который ссылается на этот идентификатор. Надеюсь, это яснее. –

+0

Да, но в представлении отсутствует linkDiv, а два элемента linkDetails - это только текстовые узлы, поэтому трудно точно понять, чего вы пытаетесь достичь. Кроме того, вы не указали представление для linkHandler. Чтобы создать графики Bokeh, вам нужно вернуть код HTML или JS?Какой контент находится в linkDiv (и что/где - ссылкаDiv)? – Anthony

ответ

0

Я должен признать, что я не 100% ясно, что вы пытаетесь сделать, но если вам нужно обновить, например, 2 div на вашей странице в ответ на один клик, есть несколько способов сделать это.

Самый простой и, возможно, самый способ web2py-ish состоит в том, чтобы содержать ваши цели в внешнем div, который является целью обновления.

Еще одна альтернатива, которая очень эффективна, - использовать что-то вроде Taconite [1], которое вы можете использовать для обновления нескольких частей DOM за один ответ.

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

+0

я пытался ставить цели в внешний div, и я получил еще одну копию всей страницы (меню, все) в div. Странно, должно быть, сделал что-то не так. –

+0

Если у вас нет ссылки на linkHandler, по умолчанию (только на localhost) он будет использовать представление generic.html, которое расширяет полный макет. – Anthony

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 будет идти в DOM элемент с таким идентификатором.

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

В linkHandler, вместо того, чтобы вернуться словарь (который требует представления для того, чтобы генерировать HTML), вы можете просто вернуть web2py HTML помощника, который будет автоматически сериализован в HTML, а затем вставляется в целевой DIV , Помощник CAT() просто объединяет другие элементы (в этом случае ваш скрипт и связанный div).

Смежные вопросы