2012-06-25 2 views
0

У меня есть два вызова Ajax. Мне нужно убедиться, что между этими двумя вызовами выполняется JS-функция.Море: Выполнить метод JavaScript через AJAX

Возможно ли инициировать выполнение JS-функции на стороне клиента посредством ответа AJAX? Или как бы вы это делали?


EDIT Мой код, после того, как делать то, что было предложено первым ответом (onComplete):

^ (html jQuery ajax 
    callback: [ :text | id := self createNewAnnotation: text ] 
    value: (self html jQuery: '#annotationText') value; 

    onComplete: ((JSStream on: 'displayAnnotation("', id, '")'), 
     (self html jQuery ajax 
      callback: [ :text | finalText := text ] 
      value: (self html jQuery: '#text') html) 
    ); 

Что это должен делать: на первом обратном вызове, значение #annotationText поле передается в createNewAnnotation, что сохраняет аннотацию и возвращает идентификатор. Далее, я хочу передать этот идентификатор на JS-функцию на стороне клиента displayAnnotation().

В этом примере это еще не может работать, поскольку код около JSStream on: не находится в блоке и, следовательно, имеет начальное значение id. Как передать этот результат серверного метода в качестве параметра для функции на стороне клиента?

+0

Возможно, вы захотите немного уточнить, где ваши два вызова ajax (в коде). –

ответ

2

В Приморском крае вы, вероятно, будете использовать привязки jQuery для выполнения вызовов ajax. Если вы хотите, чтобы убедиться, что два Аякс вызовов прикованы и некоторый другой код JS выполняются между ними, кодом будет следовать следующим строкам:

renderContentOn: html 
    html span 
     onClick: (html jQuery ajax 
        callback: [...1st ajax callback...]; 
        onComplete: ((JSStream on: '... some JS code ...'), 
           (html jQuery ajax callback: [...2nd ajax callback...])); 
     with: 'Click this to trigger the calls'. 

Это будет оказывать пролет, при нажатии, будет выполняться 1-й ajax-вызов. Если это завершено, будет выполнен код JS и второй вызов ajax.

EDIT: ответ на дополнительный вопрос:

Если вы хотите «идентификатор», который передается по зову displayAnnotation быть вычисленным первым обратного вызова, вы можете только генерировать, что после вызовов выполнен первый обратный вызов. Значение может быть передано между обратными вызовами ajax через временные переменные или переменные экземпляра (из-за закрытия). Следующий фрагмент кода делает цепочку через onComplete: явно. Впоследствии я приводил пример, когда делаются меньше аякс-звонков.

^ (html jQuery ajax 
    callback: [ :text | id := self createNewAnnotation: text ] 
    value: (html jQuery: #annotationText) value; 
    onComplete: 
     (html jQuery ajax 
       script:[:s | s << ((JSStream on: 'displayAnnotation("', id, '")')] 
       onComplete: 
        (html jQuery ajax 
         callback: [ :text | finalText := text ] 
         value: (html jQuery: #text) html))) 

Вы можете также уменьшить количество вызовов AJAX, если вы понимаете, как Seaside работают обратные вызовы. Таким образом, блок, который производит ответ обратного вызова, всегда вызывается последним. Это позволяет группировать несколько блоков обратного вызова в один вызов. Такие как:

^(html jQuery ajax 
      callback: [ :text | id := self createNewAnnotation: text ] 
      value: (html jQuery: #annotationText) value; 
      script:[:s | s << ((JSStream on: 'displayAnnotation("', id, '")')]; 
      onComplete: 
        (html jQuery ajax 
         callback: [ :text | finalText := text ] 
         value: (html jQuery: #text) html))) 
+0

В зависимости от вашего случая могут быть разные решения. Если вы предоставите немного больше информации о своем случае, я мог бы пойти немного подробнее. –

+0

Удивительный, звучит идеально. Я вернусь и приму это, если это сработает. – Franz

+0

Хорошо выглядит.Посмотрите на мой отредактированный вопрос, у меня есть еще одна проблема с этим (мне нужно передать параметр на клиентскую функцию, которая является результатом первого вызова сервера). – Franz

0

Объект XMLHttpRequest имеет событие onreadystatechange. Когда объект достигает readyState из 4, вы можете сделать свой второй запрос AJAX, привязывая анонимную функцию к этому событию. Если вы хотите получить более подробный ответ, напишите, что вы пробовали, и какой-то код, и сообщество SO будет более чем охотно дать вам более подробный ответ.

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