Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpages 基于复合数据获取标签值_Xpages - Fatal编程技术网

Xpages 基于复合数据获取标签值

Xpages 基于复合数据获取标签值,xpages,Xpages,我有一个自定义控件,它具有我定义的属性。我将复合数据用作自定义控件上的标签。标签显示得很好,但我想在控件上使用标签的值,该控件不包含标签和复合数据 但它将为标签的值返回null。似乎每次访问标签值时都在计算复合数据,计算的参考点似乎是访问标签值的控件,而不是包含标签值的控件 我计划改用范围变量,但有什么方法可以使复合数据工作吗?复合数据只存在于定义它的自定义控件中。因此,向外接触要比向内接触容易得多 除了范围变量外,另一种方法是定义dataContext。从技术上讲,这仍然是作用域变量的使用,因

我有一个自定义控件,它具有我定义的属性。我将复合数据用作自定义控件上的标签。标签显示得很好,但我想在控件上使用标签的值,该控件不包含标签和复合数据

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


我计划改用范围变量,但有什么方法可以使复合数据工作吗?

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

除了范围变量外,另一种方法是定义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本身中使用单个变量,但也可以将其传递到自定义控件中。

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

除了范围变量外,另一种方法是定义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本身中使用,但也可以传递到自定义控件中。

我喜欢Tim关于数据上下文的建议。但是,如果必须,可以访问控件的propertyMap上的值。这不是标签,而是复合数据。这就是组件“对话”的方式。

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

我想我的问题是为什么会这样做?您可能认为CC会为您计算值并将结果存储在标签中。就任何其他控件而言,这就像读取静态值。组件属性可以具有本地值或值绑定。直接对组件调用setValue()会为其提供一个静态本地值。相反,如果您在CC中将其值定义为引用compositeData,那么您已经定义了一个值绑定。这会导致在任何时候请求value属性时重新计算表达式。因此,您可以从CC外部调用标签上的getValue(),CC引用compositeData,该数据从外部传递。为了运行时性能和代码的清晰性,最好只是合并评估。谢谢。您将如何整合评估?似乎我只想在加载页面时进行评估(至少在本例中是这样)是有道理的。这有什么办法吗?可能在页面加载时执行此操作,并使用复合数据在那里设置标签的值?使用dataContext,如我的回答中所述,合并计算:只有dataContext计算表达式,然后可以使用dataContext的变量从多个位置引用相同的结果。为了确保只计算一次,请将其值绑定设置为在页面加载时计算(${someExpression}而不是#{someExpression}…美元符号表示对其求值一次,然后不再重新计算)。谢谢Tim,我尝试了dataContext,效果很好。我唯一的另一个问题是,我将标签的静态值设置为“#{labelLocation}”,但当我保存CC时,它将其更改为labelLocation。(期间)。这正常吗?如果我把它改为On Page Load,表达式就会消失。因此,我所做的是将其更改回Javascript,进行计算,在页面加载时输入值“#{labelLocation}”。这是我应该做的吗?我想我的问题是为什么会这样做?您可能认为CC会为您计算值并将结果存储在标签中。就任何其他控件而言,这就像读取静态值。组件属性可以具有本地值或值绑定。直接对组件调用setValue()会为其提供一个静态本地值。相反,如果您在CC中将其值定义为引用compositeData,那么您已经定义了一个值绑定。这会导致在任何时候请求value属性时重新计算表达式。因此,您可以从CC外部调用标签上的getValue(),CC引用compositeData,该数据从外部传递。为了运行时性能和代码的清晰性,最好只是合并评估。谢谢。您将如何整合评估?似乎我只想在加载页面时进行评估(至少在本例中是这样)是有道理的。这有什么办法吗?可能在页面加载时执行此操作,并使用设置标签的值