Xpages ObjectData自定义控件:将compositeData与文本混合

时间:2017-01-17 23:41:15

标签: xpages

想为我的DataObjects做一个自定义控件,它有两个属性,javaClass和javaModel。

因此,如果我有一个java类名为acme.com.model.Person,则javaClass属性为acme.com.model.Person,javaModel属性为Person。

我开始构建我的自定义控件但在遇到语法问题之前只收到了一些东西。

真正的问题是createObject。我不明白如何用createData值替换createObject中当前硬编码的“Person”。这甚至可能吗?

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xe="http://www.ibm.com/xsp/coreex">
        <xp:this.data>
        <xe:objectData
            saveObject="#{javascript:compositeData.javaModel + 'save()'}"
            var="${javascript:compositeData.javaModel}">
            <xe:this.createObject><![CDATA[#{javascript:var Person = new com.scoular.model.Person();
var unid = context.getUrlParameter("key")
if (unid != "") {
    Person.loadByUnid(unid);
    viewScope.put("readOnly","Yes");
} else {
    Person.create();
    viewScope.put("readOnly","No");
}
return Person;}]]></xe:this.createObject>
        </xe:objectData>
        </xp:this.data>
</xp:view>

1 个答案:

答案 0 :(得分:4)

正如您可能尝试将业务逻辑与“UI”(XPages标记)分离,您可以将“创建”代码移动到null类的构造函数方法,其中一个:< / p>

  • 呼叫检查“key”
  • 的URL参数
  • 将键设置为属性(使其更像bean,可选,但可能是个好主意)
  • 调用Person方法
  • 并将相应的loadByUnid(String)值放入readOnly
viewScope

然后你的public class Person implements Serializable { private static final long serialVersionUID = 1L; // constructor method public Person(){ Map<String, Object> reqParm = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); String unid = (String) reqParm.get("key"); Map<String, Object> vwScope = ExtLibUtil.getViewScope(); if (unid != "") { this.loadByUnid(unid); vwScope.put("readOnly","Yes"); } else { this.create(); viewScope.put("readOnly","No"); } } //... } 区块会更像:

createObject

这应该从标记层中移除足够多的细节,以便在特定类之间更加可重用,前提是每个自我构造都是这样。

对于一般混合<xe:this.createObject><![CDATA[#{javascript:return new com.scoular.model.Person();}]]></xe:this.createObject> 和文本,你应该传递一个对象引用,所以对于上面的save方法的例子,我认为你应该能够通过compositeData更多地访问它,如果compositeData.javaModel.save();引用的对象中存在save方法。我不认为附加一个方法的字符串会起作用,但我不能说我已经尝试过了。