如何立即设置ValueBinding绑定?

时间:2014-07-11 06:05:30

标签: xpages

我正在尝试通过扩展XspDiv创建新的UI控件。这个控件有像XspInputText这样的子项,我想用dataSource绑定它,比如“#{document.field}”或“{sessionScope.variable}”

出于绑定目的,我使用方法setValueBinding(“value”,valueBinding),当我在SSJS上打印该绑定的值时。第一次产生“null”,第二次产生“null”,结果正确。如何立即为绑定设置ValueBinding,这样当我打印该值时,它将正确生成而不会产生null。

这是我的代码

    package com.forte.component;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import com.ibm.xsp.util.FacesUtil;
import com.ibm.xsp.util.StateHolderUtil;
import com.ibm.xsp.component.xp.XspDiv;
import com.ibm.xsp.component.xp.XspInputText;
import com.ibm.xsp.component.xp.XspOutputLabel;
import com.ibm.xsp.component.xp.XspOutputText;

public class ForteInputText extends ForteBase {

public static final String RENDERER_TYPE = "com.forte.InputText";
private String inputPicker;
private String inputSize;
private String inputType;
private String inputBinding;
private String maxLength;
private String placeHolder;
private Object event;

// Component
private ValueBinding vbBinding;
private XspInputText xspInput;
private XspDiv xspDivPicker;
private XspOutputLabel xspLabelPicker;
private XspOutputText xspTag;

public ForteInputText() {
    xspInput = new XspInputText();
    xspInput.setId("forte_"+getId());
    xspDivPicker = new XspDiv();
    xspLabelPicker = new XspOutputLabel();
    xspTag = new XspOutputText();       
    setRendererType(RENDERER_TYPE);
}

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

// MAXLENGTH
public String getMaxLength() {
    if (null != this.maxLength) {
        return this.maxLength;
    }
    ValueBinding _vb = getValueBinding("maxLength");
    if (_vb != null) {
        return (String) _vb.getValue(FacesContext.getCurrentInstance());
    }
    return null;
}   
public void setMaxLength(String maxLength){
    this.maxLength = maxLength;
}

// PLACEHOLDER
public String getPlaceHolder() {
    if (null != this.placeHolder) {
        return this.placeHolder;
    }
    ValueBinding _vb = getValueBinding("placeHolder");
    if (_vb != null) {
        return (String) _vb.getValue(FacesContext.getCurrentInstance());
    }
    return null;
}   
public void setPlaceHolder(String placeHolder){
    this.placeHolder = placeHolder;
}

//INPUT BINDING
public String getInputBinding() {
    if (null != this.inputBinding) {
        String valueExp = "#{"+inputBinding+"}";
        vbBinding = FacesContext.getCurrentInstance().getApplication().createValueBinding(valueExp);
        ((XspInputText) xspInput).setValueBinding("value", vbBinding);
        return this.inputBinding;
    }
    ValueBinding _vb = getValueBinding("inputBinding");
    if (_vb != null) {
        String valueExp = "#{"+inputBinding+"}";
        vbBinding = FacesContext.getCurrentInstance().getApplication().createValueBinding(valueExp);
        xspInput.setValueBinding("value", vbBinding);
        return (String) _vb.getValue(FacesContext.getCurrentInstance());
    }

    return null;
}   
public void setInputBinding(String inputBinding){
    this.inputBinding = inputBinding;   
    String valueExp = "#{"+inputBinding+"}";
    vbBinding = FacesContext.getCurrentInstance().getApplication().createValueBinding(valueExp);
    xspInput.setValueBinding("value", vbBinding);
}

//INPUT SIZE
public String getInputSize() {
    if (null != this.inputSize) {
        return this.inputSize;
    }
    ValueBinding _vb = getValueBinding("inputSize");
    if (_vb != null) {
        return (String) _vb.getValue(FacesContext.getCurrentInstance());
    }
    return null;
}   
public void setInputSize(String inputSize){
    this.inputSize = inputSize;
}

//INPUT TYPE
public String getInputType() {
    if (null != this.inputType) {
        return this.inputType;
    }
    ValueBinding _vb = getValueBinding("inputType");
    if (_vb != null) {
        return (String) _vb.getValue(FacesContext.getCurrentInstance());
    }
    return null;
}   
public void setInputType(String inputType){
    this.inputType = inputType;
}

//INPUT PICKER
public String getInputPicker() {
    if (null != this.inputPicker) {
        return this.inputPicker;
    }
    ValueBinding _vb = getValueBinding("inputPicker");
    if (_vb != null) {
        return (String) _vb.getValue(FacesContext.getCurrentInstance());
    }
    return null;
}   
public void setInputPicker(String inputPicker){
    this.inputPicker = inputPicker;
}

//INPUT EVENT
public Object getEvent() {
    if (null != this.event) {
        return this.event;
    }
    ValueBinding _vb = getValueBinding("event");
    if (_vb != null) {
        return  _vb.getValue(FacesContext.getCurrentInstance());
    }
    return null;
}   
public void setEvent(Object event){
    this.event = event;
}


// VALUE
public Object getValue() {
    return xspInput.getValue();
}

public void setValue(Object value){
    xspInput.setValue(value);   
}

@Override   
public void restoreState(FacesContext _context, Object _state) {
    Object _values[] = (Object[]) _state;
    super.restoreState(_context, _values[0]);
    this.placeHolder = (String) FacesUtil.objectFromSerializable(_context, this, _values[1]);
    this.inputBinding =  (String) FacesUtil.objectFromSerializable(_context, this, _values[2]);
    this.inputSize = (String) FacesUtil.objectFromSerializable(_context, this, _values[3]);
    this.inputType = (String) FacesUtil.objectFromSerializable(_context, this, _values[4]);
    this.inputPicker = (String) FacesUtil.objectFromSerializable(_context, this, _values[5]);
    this.maxLength = (String) FacesUtil.objectFromSerializable(_context, this, _values[6]);
    this.event =  (Object) FacesUtil.objectFromSerializable(_context, this, _values[7]);
    this.vbBinding = StateHolderUtil.restoreValueBinding(_context, xspInput, _values[8]);
}

@Override
public Object saveState(FacesContext _context) {
    Object _values[] = new Object[8];
    _values[0] = super.saveState(_context);
    _values[1] = FacesUtil.objectToSerializable(_context, placeHolder);
    _values[2] = FacesUtil.objectToSerializable(_context, inputBinding);
    _values[3] = FacesUtil.objectToSerializable(_context, inputSize);
    _values[4] = FacesUtil.objectToSerializable(_context, inputType);       
    _values[5] = FacesUtil.objectToSerializable(_context, inputPicker);     
    _values[6] = FacesUtil.objectToSerializable(_context, maxLength);
    _values[7] = FacesUtil.objectToSerializable(_context, event);
    _values[8] = StateHolderUtil.saveValueBinding(_context, vbBinding);


     return _values;
}

public Object getInputTextChild(String strChild){
    if(strChild=="input")return xspInput;
    if(strChild=="divPicker") return xspDivPicker;
    if(strChild=="labelPicker") return xspLabelPicker;
    return null;
}           

// GET CHILD COMPONENT

public XspInputText getInputText(){
    return xspInput;
}

public XspDiv getDivPicker(){
    return xspDivPicker;
}

public XspOutputLabel getLabelPicker(){
    return xspLabelPicker;
}

public XspOutputText getTag(){
    return xspTag;
}

}

1 个答案:

答案 0 :(得分:0)

我通过改变来自" private"的变量声明解决了这个问题。组件到"受保护"。另外,我在组件类的构造函数中添加了getChildren()。add(childComponent)而不是渲染器类。

请参阅我的代码:

protected XspInputText xspInput;
protected XspDiv xspDivPicker;
protected XspOutputLabel xspLabelPicker;
protected XspOutputText xspTag;

public ForteInputText() {
    xspInput = new XspInputText();
    xspDivPicker = new XspDiv();
    xspLabelPicker = new XspOutputLabel();
    xspTag = new XspOutputText();       
    xspTag.setTagName("i");
    xspDivPicker.getChildren().add(xspInput);
    xspDivControl.getChildren().add(xspDivPicker);
    setRendererType(RENDERER_TYPE);     
}