Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/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
Javascript 有没有办法从UIComponent对象获取生成的HTML作为字符串,并在呈现响应阶段正确绑定所有ajax侦听器?_Javascript_Ajax_Jsf_Primefaces - Fatal编程技术网

Javascript 有没有办法从UIComponent对象获取生成的HTML作为字符串,并在呈现响应阶段正确绑定所有ajax侦听器?

Javascript 有没有办法从UIComponent对象获取生成的HTML作为字符串,并在呈现响应阶段正确绑定所有ajax侦听器?,javascript,ajax,jsf,primefaces,Javascript,Ajax,Jsf,Primefaces,这是一个后续行动 环境 Primefaces 8.0.RC3 JSF 2.2.15 Tomcat 8.5.47 背景 我有一个自定义JSF组件,它扩展了UIComponentBase public final class Map extends UIComponentBase implements Widget { // resolveWidgetVar // a constructor // getters/setters } 有MapRenderer将渲染该组件 p

这是一个后续行动

环境 Primefaces 8.0.RC3
JSF 2.2.15
Tomcat 8.5.47

背景 我有一个自定义JSF组件,它扩展了
UIComponentBase

public final class Map extends UIComponentBase implements Widget {
    // resolveWidgetVar
    // a constructor
    // getters/setters
}
MapRenderer
将渲染该组件

public final class MapRenderer extends CoreRenderer {

    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        final Map map = (Map) component;

        encodeMarkup(context, map);
        encodeScript(context, map);
    }

    private void encodeMarkup(FacesContext context, Map map) throws IOException {
        // renders a div
    }

    private void encodeScript(FacesContext context, Map map) throws IOException {
        // renders a script with PF.cw(widgetName, widgetVar, cfg)
    }

}
它将是一个基于图例的地图,图例定义为
SelectManyMenu
组件。图例同时用作图例和过滤器。挑战是很好地将所需的一切传递给JS端。为此,我采用了如下所示的方法-我基本上是将通过编程创建的
SelectManyMenu
编码到我的
Writer

然后,我将其分为两部分(因为控件(此处为图例)的定义方式-请参见下面的函数):

  • 一个JS代码段
    executeInteractiveLegendScript
    (带有一行代码用于创建Primefaces小部件)和

  • HTML片段
    GetInteractiveElegendHTML
    (菜单的标记)


  • configuration
    是我在Java端编译的一个对象。在某个时候,通过JS,我将图例添加到地图中。JS代码段执行正确,Primefaces元素显示正确-这里没有问题

    问题 问题在于为这个以编程方式创建的组件定义客户端行为

    // while rendering the map
    
    SelectManyMenu selectManyMenu = (SelectManyMenu) context.getApplication()
        .createComponent(SelectManyMenu.COMPONENT_TYPE);
    
    // setting children and properies
    selectManyMenu.addClientBehavior("change", createAjax(context));
    
    selectManyMenu.encodeAll(context);
    
    创建
    ClientBehavior
    的方法定义如下

    private ClientBehavior createAjax(FacesContext context) {
        Application application = context.getApplication();
        ExpressionFactory expressionFactory = application.getExpressionFactory();
        AjaxBehavior behavior = (AjaxBehavior) application.createBehavior(AjaxBehavior.BEHAVIOR_ID);
    
        MethodExpression methodExpression = expressionFactory.createMethodExpression(context.getELContext(), "#{myexpression}", Void.TYPE, new Class[]{String.class});
        AjaxBehaviorListenerImpl listener = new AjaxBehaviorListenerImpl(methodExpression, methodExpression, methodExpression);
    
        behavior.setProcess("@this");
    
        // PROBLEM HERE - this listener never gets invoked
        behavior.addAjaxBehaviorListener(listener);
    
        return behavior;
    }
    
    我怀疑我在哪里注册了这种客户行为,可能是因为太晚了,而听众根本没有得到正确的注册

    问题是如何让它工作,我应该在哪里创建菜单实例并绑定所有属性/侦听器

    @提到巴卢斯克

    (假设您正处于调用应用程序阶段;当处于呈现响应阶段时,这需要以不同的方式进行):


    这证实了我做错了什么。

    我看不到您认为这种方法存在问题的实际用例?感觉很“黑”。题外话:在评论中乞求(请求)帮助是不受欢迎的…@Kukeltje,它既黑又脏。我只是想不出更好的方法来实现这一点。但是如果您的实际用例不清楚,我们就无法帮助您了解更好的方法是什么。@Kukeltje您能详细说明什么是不清楚的吗?我尽量说得具体一些。ajax侦听器从未被调用,因为它可能是在错误的位置使用selectOneMenu作为图例和过滤器注册的。。。作为一个过滤器是清楚的,作为一个传奇,在你打开它之前,你不会只看到一件事。在这方面,selectOneRadio会更清晰。所以在你的技术问题“一分为二”之前的一切,添加到地图上等等。。。您希望在ui设计级别实现什么。“传单”与技术问题的哪一部分有关?还是仅仅因为您使用了标签就应用了标签?我看不到您认为这种方法存在问题的实际用例?感觉很“黑”。题外话:在评论中乞求(请求)帮助是不受欢迎的…@Kukeltje,它既黑又脏。我只是想不出更好的方法来实现这一点。但是如果您的实际用例不清楚,我们就无法帮助您了解更好的方法是什么。@Kukeltje您能详细说明什么是不清楚的吗?我尽量说得具体一些。ajax侦听器从未被调用,因为它可能是在错误的位置使用selectOneMenu作为图例和过滤器注册的。。。作为一个过滤器是清楚的,作为一个传奇,在你打开它之前,你不会只看到一件事。在这方面,selectOneRadio会更清晰。所以在你的技术问题“一分为二”之前的一切,添加到地图上等等。。。您希望在ui设计级别实现什么。“传单”与技术问题的哪一部分有关?还是仅仅因为您使用了标记就应用了标记?
    private ClientBehavior createAjax(FacesContext context) {
        Application application = context.getApplication();
        ExpressionFactory expressionFactory = application.getExpressionFactory();
        AjaxBehavior behavior = (AjaxBehavior) application.createBehavior(AjaxBehavior.BEHAVIOR_ID);
    
        MethodExpression methodExpression = expressionFactory.createMethodExpression(context.getELContext(), "#{myexpression}", Void.TYPE, new Class[]{String.class});
        AjaxBehaviorListenerImpl listener = new AjaxBehaviorListenerImpl(methodExpression, methodExpression, methodExpression);
    
        behavior.setProcess("@this");
    
        // PROBLEM HERE - this listener never gets invoked
        behavior.addAjaxBehaviorListener(listener);
    
        return behavior;
    }