0

2 つの Ajax 呼び出しがあります。これら 2 つの呼び出しの間に JS 関数が実行されるようにする必要があります。

AJAX 応答を介してクライアント側の JS 関数の実行をトリガーすることは可能ですか? または、このようなことをどのようにしますか?


最初の回答で提案されたことを実行した後、私のコードを編集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、アノテーションが保存され、ID が返されます。次に、その ID をクライアント側の JS 関数に渡したいと思いますdisplayAnnotation()

JSStream on:この例では、コードがブロック内にないため、初期値が であるため、これはまだ機能しませんid。サーバー側メソッドの結果をパラメーターとしてクライアント側関数に渡すにはどうすればよいですか?

4

2 に答える 2

2

Seaside では、おそらく jQuery バインディングを使用して ajax 呼び出しを実行するでしょう。2 つの 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'.

これにより、クリックすると最初の ajax 呼び出しを実行するスパンがレンダリングされます。それが完了すると、JS コードと 2 番目の ajax 呼び出しが実行されます。

編集:追加の質問への回答:

の呼び出しに渡される「id」をdisplayAnnotation最初のコールバックで計算する場合は、最初のコールバックが実行された後にのみその呼び出しを生成できます。一時変数またはインスタンス変数を介して ajax コールバック間で値を渡すことができます (クロージャーのため)。次のコードは、連鎖をonComplete:明示的に行います。その後、ajax 呼び出しが少ない例を挙げます。

^ (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)))

Seaside コールバックの仕組みを理解していれば、ajax 呼び出しの数を減らすこともできます。要約すると、コールバックの応答を生成するブロックは常に最後に呼び出されます。これにより、多数のコールバック ブロックを 1 回の呼び出しでグループ化できます。そのような:

    ^ (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)))
于 2012-06-26T06:01:02.350 に答える
0

XMLHttpRequest オブジェクトにはonreadystatechangeイベントがあります。オブジェクトがreadyState4 に達すると、匿名関数をそのイベントにバインドすることにより、2 番目の AJAX 要求を行うことができます。より詳細な回答が必要な場合は、試したことといくつかのコードを投稿してください。SO コミュニティは、より詳細な回答を喜んで提供します。

于 2012-06-26T00:41:24.183 に答える