标签: naming-containers

UIForm与prependId ="false"中断<f:ajax render>

我对这个事实背后的想法有一个疑问,即只有UIForm属性prependId.为什么NamingContainer界面中没有指定属性?你现在可能会说这是因为后向兼容性但我宁愿打破兼容性并让实现该接口的用户也实现prependId的方法.

从我对UIForm组件中的prependId的观点来看,主要的问题是它会破坏findComponent() 我希望如果我使用prependId,那么NamingContainer行为会改变,不仅与渲染有关,而且在想要在组件树中搜索组件时也是如此.

这是一个简单的例子:

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)

现在,当我想获得panelGroup组件时,我希望将字符串传递"group"给方法findComponent(),但它不会找到任何东西,我必须使用"test:group".

具体问题是,当使用ajax时prependId="false".ajax标记在属性更新和处理中期望值关注命名容器.有点奇怪的是,当我使用它时prependId="false",我必须指定完整的id或路径,但没关系.

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/>
</h:form>
<h:form id="test1" prependId="false">
  <h:commandButton value="go">
    <f:ajax render="test:group"/>
  </h:commandButton>
</h:form>
Run Code Online (Sandbox Code Playgroud)

那么这段代码将呈现没有问题,但它不会更新panelGroup,因为它无法找到它.在PartialViewContext将只包含ID "group"为renderIds的元素.我不知道这是否是预期的,可能是但我不知道代码.现在我们到了方法findComponent()无法找到组件的位置,因为作为参数传递的表达式是"group"方法期望"test:group"找到组件的位置.

一种解决方案是编写自己的解决方案,findComponent()这是我选择处理此问题的方式.在这个方法中,我处理一个组件,它是一个NamingContainer并且具有属性prependId像正常一样设置为false UIComponent.我将不得不为每个UIComponent提供prependId属性的事情做到这一点,这很糟糕.反射将有助于绕过类型的静态定义,但它仍然不是一个非常干净的解决方案.

另一种方法是在NamingContainer接口中引入prependId属性,并改变行为,findComponent()如上所述.

最后提出的解决方案是改变ajax标记的行为以传递整个id,但这只能解决ajax问题而不是findComponent()实现背后的程序问题.

你怎么看待这个以及它为什么会这样实现呢?我不能成为第一个遇到这个问题的人,但是我找不到相关的主题?!

forms ajax jsf naming-containers

20
推荐指数
1
解决办法
8446
查看次数

在render/update属性中获取模板中父命名容器的id

我有一个模板,在其定义中我使用了几个表单和按钮.

问题是定义(定义)xhtml文件不知道组件层次结构.

例如,我想在同一个定义文件中以不同的形式更新元素"table2".

模板插入:

<p:tabView id="nav"> <!-- nav -->
    <ui:insert name="content_nav">content navigation</ui:insert>
</p:tabView>
Run Code Online (Sandbox Code Playgroud)

定义我的层次结构"nav"的第一级

模板定义:

<ui:define name="content_nav">
    <h:form id="form1"> <!-- nav:form1 -->
        <h:dataTable id="table1"/> <!-- nav:form1:table1 -->
        <p:inputText value="#{bean.value}"/>
        <p:commandButton action="..." update="nav:form2:table2"/>
    </h:form>
    <h:form id="form2">
        <h:dataTable id="table2"/> <!-- nav:form2:table2 -->
        <!-- other elements -->
    </h:form>
</ui:define>
Run Code Online (Sandbox Code Playgroud)

在我的定义部分,我不想知道"导航"!

我怎样才能做到这一点?或者如何向上移动一个命名组件?或者将最高父完整ID保存在变量中?

有时我看到类似的东西:

update=":table2"
Run Code Online (Sandbox Code Playgroud)

但是我找不到任何关于这个的信息?,JavaEE 6文档只是提到@关键字.

el naming-containers primefaces jsf-2

17
推荐指数
1
解决办法
3万
查看次数

Jsf如何创建命名容器

我的JSF应用程序中存在重复ID的问题.我在这篇文章中读过,其中一个可能的解决方案是使用命名容器.你能给我一些例子来说明如何使用命名容器来避免重复的id问题吗?我使用Facelets.

jsf facelets naming-containers

7
推荐指数
1
解决办法
8960
查看次数

ASP.NET DataSource控件"没有命名容器"异常

我一直在我的代码中得到这个例外,并想知道是否有人可以帮助我.

我有一个绑定到ObjectDataSource的Repeater控件,并且转发器的itemtemplate包含一个用户控件(ASCX).该用户控件又包含几个其他控件,主要是与ObjectDataSource关联的GridView.

在此设置中初始使用控件时,一切都很好 - 数据显示正常.但是,当我更改过滤器选项(转发器外部的下拉菜单),然后重新绑定Repeater时,我得到异常:

ObjectDataSource控件'expDataSource'没有命名容器.确保在调用DataBind之前将控件添加到页面中."在System.Web.UI.Web.控件,控件控件,字符串控件ID中的System.Web.UI.WebControls.DataBoundControlHelper.FindControl(控件控件,字符串控件ID)......"处于System.Web.UI.WebControls.ObjectDataSource. LoadCompleteEventHandler(Object sender,EventArgs e)

我不确定问题是什么 - 我在一些地方读过,将数据源移到ASCX控件之外可能会有所帮助 - 这没什么用.objectdatasource看起来结构合理,正如我所说,它是第一次(仅).

我在堆栈跟踪中注意到,当发生LoadComplete()之后ASP.NET正在调用FindControl()时发生这种情况.如果我单步执行代码,似乎所有代码都在执行之前完成执行,因此它是所有"系统"代码.

为什么ASP.NET无法在LoadComplete处理程序中找到此数据源控件?

谢谢!

其他说明:

  • 每隔一次都会发生此错误.因此,第一次正确加载数据时,第二次刷新会因此错误而失败.再次单击"加载",它可以工作(第三次).

  • 在它失败的时候,看起来在ASCX控件中调用了两次"Page_Load".所以模式是:

    1. 工作模式:
  • 父页面上的Page_Load
  • ASCX上的Page_Load
  • 数据加载正常

    1. 失败模式:
  • 父页面上的Page_Load
  • ASCX上的Page_Load
  • ASCX上的Page_Load
  • 例外

这一切都发生在对"Repeater.DataBind()"的调用中,但它的行为会有所不同,具体取决于它是否已被绑定(显然).

更多说明:

真奇怪的行为.我从ObjectDataSource的底部删除了SelectParameters列表,突然之间,该页面没有拒绝ObjectDataSource,因为没有NamingContainer.当然,没有这些参数,数据绑定实际上不会起作用......我可以在代码中添加它们,但为什么它会重要?

asp.net data-binding datasource exception naming-containers

5
推荐指数
1
解决办法
1万
查看次数

如何实现NamingContainer?所有孩子都获得相同的客户ID

我尝试编写自己的树组件.树节点呈现为包含树组件的子组件的div,例如:

<my:tree id="extendedTree"
         value="#{controller.rootNode}"
         var="node">
    <h:outputText id="xxx" value="#{node.name}" />
    <h:commandLink value="Test" actionListener="#{controller.nodeSelectionActionListener}" />
</my:tree>
Run Code Online (Sandbox Code Playgroud)

到目前为止,这么好 - 一切都按预期工作,但h:outputText重复获得相同的id.
所以我有我的组件工具javax.faces.NamingController,覆盖getContainerClientId():

@Override
public String getContainerClientId(FacesContext context) {
    String clientId = super.getClientId(context);
    String containerClientId = clientId + ":" + index;
    return containerClientId;
}
Run Code Online (Sandbox Code Playgroud)

index在迭代过程中设置和更新节点.但getContainerClientId()每个孩子只会被召唤一次(不是每次迭代和每个孩子,正如我所期望的那样).这会导致每个子ID都以相同的容器ID作为前缀:

form:treeid:0:xxx
Run Code Online (Sandbox Code Playgroud)

覆盖也是一样的getClientId().

我错过了什么?

tree jsf naming-containers custom-component jsf-1.2

4
推荐指数
1
解决办法
588
查看次数

如何通过clientId访问复合组件的兄弟

我有一个复合组件捆绑一些输入字段.该组件将在页面上多次使用,并包含一个用于复制其他组件的值的按钮.为此,我需要通过其clientId访问其中一个兄弟姐妹作为目标

<f:ajax execute=":XXX:siblingId" render="...">

我的问题在于构建此ID.我有兄弟的名字,我可以确保它与包含复制按钮的组件位于相同的命名容器中,但我无法控制完整的嵌套层次结构,因此它可能是:form:foo:bar:parent:child或只是form:parent:child.所以基本上我想获得当前复合组件的前缀,但没有组件自己的ID,然后附加要从中复制的组件的ID.

这与以下问题类似:

但是,这两个答案使用PrimeFaces-sepcific功能,如@parentwidgetVar,这并不适用于我的项目.

在试验EL的隐式对象时,我基本上尝试了与第二个问题的海报相同的东西 - 结果相同:cc.parent.clientId总是空的.我也尝试cc.namingContainer.clientId了两种组合,唉 - 没有成功.特别是parent不能按预期工作的事实让我感到困惑......

那么:是否存在与组件库无关的方式来访问包含复合组件命名容器的"路径"?该如何parent对象应该工作,尤其是:我们什么时候可以使用它,何时不?

PS:我正在考虑使用复合的完整clientId然后修剪它的实际ID fn:split,但是,如果有更直接的方式我会乐意使用它.

jsf clientid naming-containers composite-component

3
推荐指数
1
解决办法
2806
查看次数

实现NamingContainer的组件列表

我发现NamingContainerJSF 中有一些东西叫做.目前尚不清楚哪个组件是命名容器.据我所知,<h:form>,<h:dataTable>和自定义组件的命名容器.

我在哪里可以获得实现的类列表javax.faces.component.NamingContainer

jsf components naming-containers jsf-2

3
推荐指数
1
解决办法
6648
查看次数

变量名称的长度是否会影响程序运行的速度?

我有一小段代码需要运行很长时间.我想知道我使用的变量名称的长度是否会改变程序执行的速度.这是一个用Python编写的非常简单的示例.

计划A.

    x = 1
    while not x == 0:
          print('message')
Run Code Online (Sandbox Code Playgroud)

方案B.

    xyz = 1
    while not xyz == 0:
          print('message')
Run Code Online (Sandbox Code Playgroud)

如果我在两台相同的机器上运行程序A和程序B 30年,程序A将打印"消息"的次数多于程序B.

python performance naming-conventions naming-containers

2
推荐指数
1
解决办法
84
查看次数