首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><a4j:jsFunction>调用从服务器返回未定义的

<a4j:jsFunction>调用从服务器返回未定义的
EN

Stack Overflow用户
提问于 2016-02-16 18:27:40
回答 1查看 661关注 0票数 2

在我的托管Bean中,我有一个简单的布尔方法:

代码语言:javascript
复制
public class UploadBean {

    // ...

    public boolean getPossuiNotasFiscaisNaoTransmitidas() {
        boolean result = false;

        // Some computation ...

        return result;
    }

}

在我的XHTML页面中,我使用的是RichFaces 3.3.3 tabPanel。在一个特定的选项卡中,我需要确认是否真的打开它:

代码语言:javascript
复制
    <a4j:jsFunction name="possuiNotasFiscaisNaoTransmitidas" action="#{uploadBean.getPossuiNotasFiscaisNaoTransmitidas}" immediate="true" process="tab-10" ajaxSingle="true" reRender="tab-10"/>
    <a4j:loadScript src="../../js/orcamentoVistoria.js"/>
    <rich:tabPanel id="abas" switchType="ajax" >
        <!-- many tabs... -->
        <rich:tab 
                id="tab-10" 
                name="tab-10" 
                ontabenter="return prosseguirAbaNotasFiscais();"
                ontableave="return prosseguirAbaNotasFiscais();" >
            <!-- content -->
        </rich:tab>
    </rich:tabPanel>

prosseguirAbaNotasFiscais()函数在orcamentoVistoria.js中调用托管bean方法:

代码语言:javascript
复制
function prosseguirAbaNotasFiscais() {
    console.info("prosseguirAbaNotasFiscais: Entrando");                                // LOG 1
    var serverResponse = possuiNotasFiscaisNaoTransmitidas();
    console.info("prosseguirAbaNotasFiscais: serverResponse? " + serverResponse);       // LOG 2
    var result = serverResponse ? confirm("Proceed?"): true;
    console.info("prosseguirAbaNotasFiscais: Resultado? " + result);                    // LOG 3
    return result;
}

我期望的:当我在选项卡中输入(或离开)时,页面将调用托管bean方法。如果它的答案是正确的,它将被问到用户是否想继续进入/离开。如果它的回答是错误的,那么选项卡将被直接输入/离开。

我真正得到的:当我在选项卡中输入(或离开)时,页面显然调用了托管bean方法。至少,在调试中,我可以看到正在执行的方法(实际上很多次)。但是,在JS返回(LOG 2行)中,serverResponse变量未定义。就像页面没有等待服务器响应一样。因此,JS函数将始终返回true,而选项卡始终将直接输入/离开。

那我该怎么办?它是<a4j:jsFunction>标签中的某个特定属性吗?

谢谢

拉斐尔·阿丰索

更新17/02/2016

@Makhiel,谢谢你的建议。但是,我需要的是,在执行oncomplete之后,允许或不允许选项卡更改。但是(至少我能理解),只有通过选项卡的ontabenterontableave才有可能。

按照Makhiel的建议,我在代码中执行了以下建议:

管理豆

代码语言:javascript
复制
public class UploadBean {

    private boolean questionarAbaNotasFiscais = false;

    // ...

    public boolean getPossuiNotasFiscaisNaoTransmitidas() {
        this.questionarAbaNotasFiscais = false;

        // Some computation. It can change questionarAbaNotasFiscais or not ...

        return this.questionarAbaNotasFiscais;
    }

    // ...

    public boolean isQuestionarAbaNotasFiscais() {
        return questionarAbaNotasFiscais;
    }
}

XHTML:

代码语言:javascript
复制
<a4j:jsFunction name="possuiNotasFiscaisNaoTransmitidas" action="#{uploadBean.getPossuiNotasFiscaisNaoTransmitidas}"
    data="#{uploadBean.questionarAbaNotasFiscais}" oncomplete="questionarAbaNotasFiscais = data; console.timeEnd('consulta');console.info('servidor retornou ' + questionarAbaNotasFiscais)"
    immediate="true" process="tab-10" ajaxSingle="true" reRender="tab-10"/>
<a4j:loadScript src="../../js/orcamentoVistoria.js"/>
<rich:tabPanel id="abas" switchType="ajax" >
    <!-- many tabs... -->
    <rich:tab 
            id="tab-10" 
            name="tab-10" 
            ontabenter="return prosseguirAbaNotasFiscais();"
            ontableave="return prosseguirAbaNotasFiscais();" >
        <!-- content -->
    </rich:tab>
</rich:tabPanel>

Java脚本

代码语言:javascript
复制
var questionarAbaNotasFiscais = null;

function prosseguirAbaNotasFiscais() {
//  questionarAbaNotasFiscais = null;
    console.info("prosseguirAbaNotasFiscais: Entrando");
    console.time("consulta");
    var b = possuiNotasFiscaisNaoTransmitidas();

    console.info("prosseguirAbaNotasFiscais: Esperando retorno. b = " + b);
    console.time("watingReturn")
    while(typeof questionarAbaNotasFiscais === null) {
        // wait for return
    }
    console.timeEnd("watingReturn")
    console.info("prosseguirAbaNotasFiscais: respostaServidor? " + questionarAbaNotasFiscais);
    var result = questionarAbaNotasFiscais ? confirm(msgNotasNaoTransmitidas): true;
    console.info("prosseguirAbaNotasFiscais: Resultado? " + result);

    questionarAbaNotasFiscais = null;
    return result;
}

我想要的prosseguirAbaNotasFiscais()函数调用possuiNotasFiscaisNaoTransmitidas(),等待全局变量questionarAbaNotasFiscais填充oncomplete,然后继续等待。一旦在这个声明中和prosseguirAbaNotasFiscais()函数的末尾总是将questionarAbaNotasFiscais设置为null,就会等待始终执行上面的循环,直到oncomplete被执行时才结束。

我得到了什么:当prosseguirAbaNotasFiscais()被执行时,调用服务器函数,但显然没有等待服务器返回。我注意到,首先调用JS函数,重新加载页面,然后调用服务器函数。

好的,服务器函数被执行异步。那么,是否有什么方法可以强制等待服务器功能呢?

谢谢,

拉斐尔·阿丰索

EN

回答 1

Stack Overflow用户

发布于 2016-02-17 09:23:58

代码语言:javascript
复制
var serverResponse = possuiNotasFiscaisNaoTransmitidas();

这将不起作用,JavaScript方法不能直接在服务器上执行方法并将结果返回给您。a4j:jsFunction所做的是向服务器发送AJAX请求,然后服务器返回一个响应。它是异步的,所以是的,页面没有在服务器上等待(如果是这样的话,那就不好了)。

而不是从bean方法返回结果,而是将结果保存到bean属性中,然后使用@data:

代码语言:javascript
复制
<a4j:jsFunction data="#{bean.result}"
    name="possuiNotasFiscaisNaoTransmitidas" 
    oncomplete="if (data) {doSomething();}"
    … />

当响应从服务器返回时,将执行"oncomplete“代码。

我不确定结果值是否将直接放在data变量中,最好用console.log检查一下。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35440311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档