java - 将 javascript 变量传递给自定义 Primefaces 组件

标签 java javascript jsf-2 primefaces

我正在尝试在 Primefaces 自定义组件的 JS 小部件代码中检索 javascript 变量(数组)的内容...我知道我缺少组件及其渲染器 java 代码中的步骤!

事实上,我想根据存储在 javascript 数组中的命令列表在 Primefaces 终端上添加一个完成功能(以及其他功能),我希望在扩展的属性中提供这些功能终端组件 例如:<my:terminal completion="commandsList" /> 有:var commandsList = ["foo", "bar"];

这是目前的代码:

我的终端.java

@ResourceDependencies({
@ResourceDependency(library="primefaces", name="terminal/terminal.css"),
@ResourceDependency(library="primefaces", name="primefaces.css"),
@ResourceDependency(library="primefaces", name="jquery/jquery.js"),
@ResourceDependency(library="primefaces", name="jquery/jquery-plugins.js"),
@ResourceDependency(library="primefaces", name="primefaces.js"),
@ResourceDependency(library="primefaces", name="terminal/terminal.js"),
@ResourceDependency(library="js", name="terminal.js")
 })
 @FacesComponent(MyTerminal.COMPONENT_TYPE)
 public class MyTerminal extends Terminal {
public static final String COMPONENT_FAMILY = "com.jsf.components";
public static final String COMPONENT_TYPE = "com.jsf.components.MyTerminal";

@Override
public String getFamily() {
    return COMPONENT_FAMILY;
}

@Override
public String getRendererType() {
    return MyTerminalRenderer.RENDERER_TYPE;
}

private enum PropertyKeys {
    completion
}

public String getCompletion() {
    return (String) getStateHelper().eval(PropertyKeys.completion, null);
}

public void setCompletion(String completion) {
    getStateHelper().put(PropertyKeys.completion, completion);
}
}

MyTerminalRenderer.java

@FacesRenderer(
componentFamily = MyTerminal.COMPONENT_FAMILY,
rendererType = MyTerminalRenderer.RENDERER_TYPE
 )
 public class MyTerminalRenderer extends TerminalRenderer {

public static final String RENDERER_TYPE = "com.jsf.components.MyTerminalRenderer";

protected void encodeScript(FacesContext context, Terminal terminal) throws IOException {
    String clientId = terminal.getClientId(context);
    WidgetBuilder wb = getWidgetBuilder(context);
    wb.init("MyTerminal", terminal.resolveWidgetVar(), clientId);
    wb.finish();
}

@Override
public void encodeEnd(FacesContext context, UIComponent component)
           throws java.io.IOException {
     MyTerminal terminal = (MyTerminal) component;
     /* TREATMENT HERE ? */
     super.encodeEnd(context, component);
}
 }

终端.js

PrimeFaces.widget.MyTerminal = PrimeFaces.widget.Terminal.extend({

init : function(cfg) {
    this._super(cfg);
    // WOULD LIKE TO GET commandsList VAR HERE!
},

非常感谢任何帮助,我知道我可以直接从小部件的 init 函数访问命令列表数组,但我真的很想确保可扩展性。 非常感谢!

最佳答案

作为我认为的解决方法,我设法使用直通参数来做到这一点,方法如下:

<my:terminal ... pt:completion="commandsList" />

使用 xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"

并通过评估作为 javascript 数组名称的“完成”属性值在小部件的 javascript 代码中检索它:

PrimeFaces.widget.MyTerminal = PrimeFaces.widget.Terminal.extend({

init : function(cfg) {
    this._super(cfg);
    commandsList = window[this.jq.attr('completion')];
},

...但我对这个解决方案不满意,对我来说似乎是修补工作:s

编辑:更改为 window[varname] 而不是 eval(varname)...至少更安全。

关于java - 将 javascript 变量传递给自定义 Primefaces 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20824384/

相关文章:

java - 无法找到属于对象的方法

java - 使用本地属性覆盖远程 Spring Cloud 属性

java - 谷歌应用引擎 Java : Query on a child object

javascript - 查询 list 上的空指针异常

javascript - 如果单击按钮,如何重置计数器

jsf-2 - 如何在 primefaces 中创建具有百分比高度的对话框

javascript - java脚本错误对象不支持此属性或方法

java - 泛型和ArrayList

javascript - 水平对齐 div 不换行

jsf-2 - 使用 <p :commandButton> 重定向