Playframework: как изменить значение параметров вертушки без перезагрузки всей страницы?

Предположим, у меня есть представление, которое получает список таких вещей:

@(notices: Seq[Notice])

@for( not <- notices) {
   <tr> not.title </tr>
}
....

и у меня есть метод в контроллере, который вызывается ajax и изменяет значения списка. Я знаю, что метод de может возвращать результат и повторно отображать страницу с новыми значениями, например:

public Result editNotice() {
   /*change the list */
   return ok(list.render(notices);
}

Но я хочу обновить только таблицу, в которой находится список.

Как обновить список в представлении без перезагрузки всей страницы?


person Yohanna Lisnichuk    schedule 18.05.2016    source источник


Ответы (2)


Просто создайте меньшее представление для рендеринга только табличной части и используйте его в действии editNotice, затем после получения ответа AJAX замените существующий на JavaScript (возможно, jQuery)

Чтобы убедиться, что вам не нужно создавать одну и ту же разметку таблицы в двух представлениях, имейте в виду, что вы можете использовать шаблон include из другого, как показано в документы.

поэтому ваше действие AJAX будет выглядеть так:

public Result editNotice() {
   return ok(table.render(notices);
}

и ваш list.scala.html:

@(notices: Seq[Notice])

@table(notices)
....

и ваш table.scala.html:

@(notices: Seq[Notice])

<table>
  @for(not <- notices) {
    <tr><td>@not.title</td></tr>
  }
</table>

Другое решение

Возвращает JsonNode — массив объектов — из editAction и создает новую таблицу с помощью JS.

person biesior    schedule 18.05.2016
comment
Спасибо, но первый вариант работает неправильно, потому что если метод отвечает только на представление @table, то только таблица отображается как новая страница, а не обновляется текущая. Другое решение действительно не обновляет параметр... - person Yohanna Lisnichuk; 18.05.2016
comment
Этот ответ является своего рода концепцией (не проверял его), в любом случае им можно управлять наверняка, без кода для тестирования трудно создать лучший образец:/ - person biesior; 18.05.2016

Наконец, я решил, что это возвращает результат из контроллера, но заменяет содержимое в html на javascript и div.

Контроллер:

public Result editNotice() {
   return ok(table.render(notices);
}

Html: list.scala.html

@()

<div id="table">
</div>
<li>
    <a class="ajax-call" href="#table" onclick="$('#table').load('/editNotice';"/>
</li>

Html: table.scala.html

@(notices: Seq[Notice])
  <table>
     @for(not <- notices) {
       <tr><td>@not.title</td></tr>
     }
  </table>
person Yohanna Lisnichuk    schedule 25.08.2016