簡體   English   中英

將javascript變量傳遞給自定義的Primefaces組件

[英]Passing javascript variable to custom Primefaces component

我正在嘗試在Primefaces自定義組件的JS小部件代碼中檢索javascript變量(數組)的內容...我知道我在該組件及其渲染器Java代碼中缺少步驟!

事實上,我想基於存儲在javascript數組中的命令列表在Primefaces終端上添加一個完成功能(以及其他功能),並且希望在擴展終端組件的屬性中提供該功能,例如: <my:terminal completion="commandsList" />具有: var commandsList = ["foo", "bar"];

到目前為止的代碼如下:

MyTerminal.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);
}
 }

terminal.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"

並通過評估“ completion”屬性值(即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) ...至少更安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM