2012-03-12 64 views
0

我有一个自定义控件,它具有我已定义的属性。我使用自定义控件上的组合数据标签。标签显示得很好,但我想使用标签和复合数据控件之外的控件上的标签值。基于复合数据获取标签的价值

但它返回null为标签的值。似乎每次访问标签值时都会计算复合数据,并且计算的参考点似乎是访问标签值的控件而不是其包含的控件。

我打算使用范围变量,而不是有什么办法可以使复合数据工作?

+0

你的问题不清楚布鲁斯,请你提供你正在使用的代码样本,以便我们能够更好地理解你的问题。 – pipalia 2012-03-12 20:21:35

回答

3

复合数据只存在于定义它的自定义控件中。因此,向外伸展比向内伸展要容易得多。

除范围变量外,另一种方法是定义一个dataContext。这在技术上仍然是范围变量的使用,因为它将一个变量暂时放入requestScope中,但稍微容易一些,因为您不必明确告诉它这么做......它只是做到了。例如:

<xp:view 
    xmlns:xp="http://www.ibm.com/xsp/core" 
    xmlns:xc="http://www.ibm.com/xsp/custom"> 
    <xp:this.dataContexts> 
     <xp:dataContext 
      var="labelValue" 
      value="#{someExpression}" /> 
    </xp:this.dataContexts> 
    <xp:text 
     value="#{labelValue}" /> 
    <xc:labelContainer 
     labelValue="#{labelValue}" /> 
</xp:view> 

在上面的例子中,随处可见的容器内,而我在此附上这labelValue DataContext的,我可以参考#{} labelValue,它将返回任何值表达式dataContext返回。这为您提供了一个可以在XPage本身内使用的变量,但也可以传递到自定义控件中。

+0

我想我的问题是为什么会这样做?你会认为CC会为你计算价值并将结果存储在标签中。就其他控件而言,它就像读取静态值一样。 – 2012-03-12 20:00:53

+0

组件属性可以具有本地值或值绑定。在组件上调用setValue()直接给它一个静态的本地值。相反,如果您在CC中定义其值作为引用compositeData的值,那么您已经定义了一个值绑定。这会导致在请求value属性时重新计算表达式。所以你可以在CC之外的标签上调用getValue(),它指向从外部传递东西的compositeData。更好地整合评估,无论是运行时性能还是代码清晰度。 – 2012-03-12 20:34:45

+0

谢谢。你如何巩固评估?似乎(至少在这个例子中)我只想在页面加载时进行评估是有意义的。无论如何在这里做到这一点?也许在页面加载时使用复合数据来设置标签的值? – 2012-03-12 20:38:03

1

我喜欢Tim对数据上下文的建议。但是,如果必须,您可以访问控件的propertyMap上的值。这不是标签,而是复合数据。这就是组件如何回复'

+0

stwissel,我将如何访问控件的Property Map? – 2012-03-13 13:00:40

+0

var theControl = getComponent(“theControlID”); var pMap = theControl.getPropertyMap(); // Ulrich有一个例子:http://www.eknori.de/2011-07-15/get-custom-properties-from-another-custom-control/ 需要检查null! – stwissel 2012-03-13 13:18:51