Seaside: обратный вызов Ajax, а затем добавление элемента, отображаемого сервером?

Моя цель — создать элемент меню (промежуток), который при нажатии делает три вещи. Сначала он устанавливает некоторое состояние на сервере (addTurn), затем создает на сервере новый элемент (renderEmptyTurnOn) и отправляет его клиенту. Затем клиент, получив новый элемент, добавляет его к определенному элементу с классом #zdTurns. Мне нужен только один сервер туда и обратно.

Код ниже не работает, потому что renderEmptyTurnOn ожидает холст, но вместо этого я передаю ему скрипт.

Есть ли идиоматический способ сделать это, используя vanilla seaside и jquery?

renderMenuOn: h
    h div
        class: 'zdDialogMenu';
        with: [ 
                    h span
                        onClick:
                                (h jQuery ajax
                                        callback: [ self dialog addTurn ];
                                        script: [ :s | s << ((s jQuery class: #zdTurns) append: (s jQuery html: (self renderEmptyTurnOn: s))) ]);
                        with: 'Add Turn' ]

person Lyn Headley    schedule 16.09.2015    source источник


Ответы (1)


Ты почти угадал. Аргумент сообщения append: в экземпляре jQuery принимает отображаемый объект. Это может быть строка, компонент Seaside или блок. Это означает, что вы можете сделать это следующим образом:

renderMenuOn: h
  h div
    class: 'zdDialogMenu';
    with: [ 
       h span
          onClick: (h jQuery ajax
                        script: [ :s | 
                                 self dialog addTurn.
                                 s << ((s jQuery class: 'zdTurns') append: [:r | self renderEmptyTurnOn: r ]) ]);
          with: 'Add Turn' ]
person Johan B    schedule 16.09.2015
comment
Ах, спасибо! И это только одно обращение к серверу, потому что обратный вызов: первичен, а сценарий: вторичен? - person Lyn Headley; 16.09.2015
comment
Упс, нет, это не правильно. callback: регистрирует основной обратный вызов, а также script:, поэтому их нельзя комбинировать. Вместо этого используйте callback:value: и script: или просто script:. Я знаю, что это немного глупо, но сейчас так. Я адаптировал приведенный выше пример, чтобы он работал. - person Johan B; 17.09.2015