【问题标题】:Primefaces ajax callback with parameter to javascriptPrimefaces ajax回调与javascript参数
【发布时间】:2013-12-12 14:32:46
【问题描述】:

我正在努力将 Primefaces bean 属性直接发送到 javascript,以便打开新页面并将 bean 属性的内容写入新页面。

我正在使用 Primefaces 4.0。

我有一个这样的命令按钮:

 <p:commandButton id="buttonId" update="buttonId, otherComponentId"
    value="press me" process="@this" actionListener="#{homeController.myMethod}"
    oncomplete="handleComplete(xhr, status, args)">
 </p:commandButton>

在handleComplete javascript 函数中未定义参数,但未定义xhr 和状态。 javascript函数定义:

function handleComplete(xhr, status, args){
    var w = window.open();
    w.document.open();
    alert(xhr.responseText.substring(100));
    alert(status);
    alert(args);
    var d = '<head></head><body>'+ args.firstParam +'<body>';
    w.document.write(d);
    w.document.close();
}

第一个警报它给了我页面,第二个警报解析错误, 错误是:Uncaught TypeError: Cannot read property 'firstParam' of undefined

我想在 args 中传递一个这样的字符串:

public String MyMethod() {
    RequestContext context = RequestContext.getCurrentInstance();  
    context.addCallbackParam("firstParam", "my string");
      return "";
}

并使用 args.firstParam 在 javascript 中访问它。

该方法被调用,(我有一些可以工作的打印屏幕。)

我必须尝试这种方式而不是将文本设置为

<h:outputText id="myText" escape="false" rendered="true"
            value="#{homeController.property}" />

然后获取该元素的innerHTML,因为我将使用innerHTML 得到的内容与bean 中的字符串变量不同。这种方法有效,但不是我想要的。我想知道为什么 args 对象是未定义的,或者我怎样才能从 javascript 中获取可管理的 bean 属性。谢谢。

【问题讨论】:

    标签: javascript ajax primefaces


    【解决方案1】:

    首先你应该确保你的方法被调用。 如果调用正确,请放置一些日志记录或调试您的方法。

    如果没有,您可能希望将进程属性添加到按钮中, 并将进程设置为@this。

    如果在此阶段调用了您的方法,那么您的页面中存在验证错误。

    我会在 actionListener 中调用我的方法而不是在操作中,并将 () 放在最后。 Differences between action and actionListener

    试试下面的

    <p:commandButton id="buttonId"
     value="press me"  actionListener="#{homeController.myMethod()}"
     process="@this"
     oncomplete="handleComplete(xhr, status, args)">
    </p:commandButton>
    

    由于您的错误是“firstParam”未定义而不是“args”未定义,您可能需要确保您的 firstParam 值不为 null!。

    【讨论】:

    • 感谢您的帮助和快速回复。这是 javascript 函数 Uncaught TypeError: Cannot read property 'firstParam' of undefined 中的错误。我会立即编辑帖子。
    • 我已经更新了我的答案,最后还有一个建议......让我知道你有什么......@MihaiSerban
    • 你是对的,谢谢。如果我将context.addCallbackParam("firstParam", "hello world"); 添加到参数中它可以工作,但是如果我添加我的字符​​串它是空的并且它给出了一个错误。我的字符串它实际上是一个静态页面.. 可能有一些大小限制?因为我的字符串打印出来了,不是空的,而是蛮大的。
    • 但我不明白你为什么要在字符串中返回一个静态页面并附加它!我要做的是,做一个静态页面并显示它,如果它是完全静态的!如果它不是完全静态的,我会将静态部分放入页面中,并返回一个 JSON,然后将这些 JSON 填充到页面中。同样,我不会做窗口的事情,因为大多数浏览器都会阻止它。我会使用 iframe="true" 的对话框。 @MihaiSerban
    • 这个静态页面是基于多种因素在业务逻辑中生成的。它是一个渲染模板,也必须从独立应用程序中创建。我无权改变这一点。问题是,如果我使用对话框,则 doctype、head 和 html 元素会消失,并且服务器上显示的静态页面与本地生成并显示在浏览器中的页面不同。 ..我可以操纵字符串并添加头部和身体标签以及其他缺失的部分......但是如果文件中的某些内容会及时更改,它将无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2020-02-29
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多