如何使用jsf渲染器类中的字符串值初始化JavaScript变量

如何使用jsf渲染器类中的字符串值初始化JavaScript变量,javascript,jsf,jsf-2,Javascript,Jsf,Jsf 2,我正在尝试加载一个d3图形,其中包含基于我在上一页中选择的设备的信息,即基于数据的动态加载。下面给出了我当前的配置,尽管它不起作用,因为一旦加载图形,它就会将d3.event作为null异常提供给我 my faces-config.xml的渲染工具包为: <render-kit> <renderer> <display-name>ABCTopologyView</display-name>

我正在尝试加载一个d3图形,其中包含基于我在上一页中选择的设备的信息,即基于数据的动态加载。下面给出了我当前的配置,尽管它不起作用,因为一旦加载图形,它就会将d3.event作为null异常提供给我

my faces-config.xml的渲染工具包为:

  <render-kit>
            <renderer>
              <display-name>ABCTopologyView</display-name>
              <component-family>javax.faces.ABCTopologyView</component-family>
              <renderer-type>com.jsf.component.ABCView</renderer-type>
              <renderer-class>com.jsf.component.ABCViewRenderer</renderer-class>
            </renderer>
        </render-kit>
java:方法encodeEnd将数据从对象解析为JSON对象并调用javascript函数

public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)
            throws IOException {

        JsonElement dataElement = parseData(object);
        JsonObject options = dataElement.getAsJsonObject();

        JavascriptContext.addJavascriptCall(facesContext,
                String.format("topology.CreateHtml(%s);", options.toString()));
    }

您应该在
encodeEnd
方法中将JavaScript元素写入响应编写器:

ResponseWriter writer = context.getResponseWriter();
writer.startElement("script", this);
writer.writeText("alert('foo');", null);
writer.endElement("script");

用JavaScript语句替换
alert('foo')

JavascriptContext.addJavascriptCall
不是简单的JSF。(最有可能是icefaces)我认为不应该从组件中使用它,而是从Bean中使用它。我应该给出我的javascript文件的路径吗?如果你想加载javascript文件,请使用
@ResourceDependency
添加它。例如,尽管我能够在D3JavaScript中获取json对象,但d3.event返回null,这在所有JSF组件框架(如PrimeFaces、IceFaces)的源代码中都可以看到etc@user2617666也许您的JavaScript代码只能在加载文档时运行?
public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)
            throws IOException {

        JsonElement dataElement = parseData(object);
        JsonObject options = dataElement.getAsJsonObject();

        JavascriptContext.addJavascriptCall(facesContext,
                String.format("topology.CreateHtml(%s);", options.toString()));
    }
ResponseWriter writer = context.getResponseWriter();
writer.startElement("script", this);
writer.writeText("alert('foo');", null);
writer.endElement("script");