Seaside:通过AJAX执行JavaScript方法

时间:2012-06-25 23:21:10

标签: ajax seaside

我有两个Ajax调用。我需要确保在这两个调用之间执行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。如何将服务器端方法的结果作为参数传递给客户端函数?

2 个答案:

答案 0 :(得分:2)

在Seaside中,您可能会使用jQuery绑定来执行ajax调用。如果你想确保链接两个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代码和第二个ajax调用。

编辑:回答其他问题:

如果您希望第一次回调计算传递给displayAnnotation调用的'id',则只能在第一次回调执行后生成该调用。该值可以通过临时变量或实例变量(因为闭包)在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调用的次数。总之,始终最后调用产生回调响应的块。这允许在单个调用中对多个回调块进行分组。如:

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

答案 1 :(得分:0)

XMLHttpRequest对象有一个onreadystatechange事件。当对象达到readyState为4时,您可以通过将匿名函数绑定到该事件来发出第二个AJAX请求。如果您想要更详细的回复,请发布您尝试的内容和一些代码,SO社区将非常愿意为您提供更详细的答案。