Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF-Ajax-Link在链接操作之前执行部分Ajax呈现_Ajax_Jsf_Action_Render_Commandlink - Fatal编程技术网

JSF-Ajax-Link在链接操作之前执行部分Ajax呈现

JSF-Ajax-Link在链接操作之前执行部分Ajax呈现,ajax,jsf,action,render,commandlink,Ajax,Jsf,Action,Render,Commandlink,我在JSF页面中有以下内容: 虽然在执行操作之前渲染组件,但渲染效果良好。(我通过日志记录知道这一点) 在服务器上执行操作功能后,我是否有办法渲染组件 任何帮助都将不胜感激 更新1 我删除了action属性并向标记中添加了一个侦听器,尽管不幸的是它似乎没有帮助,但在呈现组件树之后仍然会调用该方法。您可以使用f:ajax的侦听器来执行逻辑,并通过以下方法之一传递行.id(删除操作=“#{manager.removeEntity(row.id)}”) 渲染工作非常完美,尽管它在执行操作之

我在JSF页面中有以下内容:


虽然在执行操作之前渲染组件,但渲染效果良好。(我通过日志记录知道这一点)

在服务器上执行操作功能后,我是否有办法渲染组件

任何帮助都将不胜感激

更新1


我删除了action属性并向标记中添加了一个侦听器,尽管不幸的是它似乎没有帮助,但在呈现组件树之后仍然会调用该方法。

您可以使用
f:ajax
侦听器来执行逻辑,并通过以下方法之一传递
行.id
(删除
操作=“#{manager.removeEntity(row.id)}”


渲染工作非常完美,尽管它在执行操作之前渲染组件

这是而不是真的。您一定是误解了日志记录。可能是您在表值的getter方法中放置了一个log语句,错误地认为它只在呈现响应期间调用。因此,这不是真的。getter的调用次数与引用属性的EL表达式的调用次数相同。这可能发生在调用操作阶段之前和之后的不同阶段。由于在datatable中有命令链接,因此在应用请求值阶段也将调用该表的值获取方法,以便查找与链接关联的行

随日志一起传递以了解在哪个阶段调用getter方法。还要注意,在托管bean getter方法中执行业务工作(如调用数据库等)是个坏主意

另见:

    • 有点晚,但我也有同样的问题。 ajax在我的jsf逻辑完成之前呈现。我的解决方案?嗯,我添加了一个确认对话框。我知道这不是一个技术解决方案,但嘿,它可以工作。一旦用户在对话框上按ok(大约需要一秒钟,此时应完成逻辑),应该呈现组件。祝你好运,希望这会有所帮助

      更改前:

      <h:commandButton action="#{bean.buisnessLogic(param1, param2)}">
        <f:ajax
            execute="components"
            render="table"
        />
      </h:commandButton>
      
      我所做的:

      在进行更改之前,我的commandButton将在添加寄存器之前呈现该表。例如,我将添加第2行,在刷新页面或添加第3行之前,它不会显示更改。我做了一些研究,我的结论是jsf将ajax标记转换为javascript,javascript直接使用ut正在等待操作完成。

      解决方案:


      现在我从ajax中删除了render属性,创建了另一个commandButton,并在新的commandButton中添加了render。这会呈现页面,但当他们确认业务逻辑完成时。是的。这可能会让人困惑。不管你怎么评论,我都会尽快回复(可能不会那么快).

      呈现阶段在应用程序逻辑阶段之后,因此您所声称的是不可能的。您能否尝试更详细地描述您的问题?您是说f:ajax的呈现发生在f:ajax的侦听器之前?您是如何做到的?
      <h:commandButton action="#{bean.buisnessLogic(param1, param2)}">
        <f:ajax
            execute="components"
            render="table"
        />
      </h:commandButton>
      
      <h:commandButton onclick="javascriptCofirm();" action="#{bean.buisnessLogic(param1, param2)}">
        <f:ajax
            execute="components"
        />
      </h:commandButton>
      <h:commandButton id="button" style="display: none">
        <f:ajax
           render="table"
        />
      </h:commandButton>
      
      function javascriptConfirm() {
         bootbox.alert("Se agrego la accion con exito.", function () {
            var boton = document.getElementById("button");
            boton.click();
         });
         e.preventdefault();
         return false;
      }