findById()返回null

时间:2014-12-15 18:12:11

标签: cq5 aem

下面是我的对话框代码,我试图通过id获取文本字段但不能在beforesubmit侦听器中执行此操作。通常我需要在特定级别找到特定的小部件,所以如果可能的话提供一些解释。

<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
    jcr:primaryType="cq:Dialog"
    title="dialog"
    xtype="dialog">
    <items
        jcr:primaryType="cq:Widget"
        xtype="tabpanel">
        <items jcr:primaryType="cq:WidgetCollection">
            <tab1
                jcr:primaryType="cq:Panel"
                title="Tab 1">
                <items jcr:primaryType="cq:WidgetCollection">
                    <textfield
                        jcr:primaryType="cq:Widget"
                        itemId="textfield1"
                        xtype="textfield"/>
                    <selectbox
                        jcr:primaryType="cq:Widget"
                        itemId="selectbox1"
                        name="./selectvalue"
                        type="select"
                        xtype="selection">
                        <options jcr:primaryType="cq:WidgetCollection">
                            <one
                                jcr:primaryType="nt:unstructured"
                                text="one"
                                value="one"/>
                            <two
                                jcr:primaryType="nt:unstructured"
                                text="two"
                                value="two"/>
                            <three
                                jcr:primaryType="nt:unstructured"
                                text="three"
                                value="three"/>
                        </options>
                    </selectbox>
                </items>
            </tab1>
        </items>
    </items>
    <listeners
        jcr:primaryType="nt:unstructured"
        beforesubmit="function(dialog){&#xa;console.log(dialog);&#xa;var item = dialog.findById(&quot;textfield1&quot;);&#xa;console.log(item);&#xa;}"/>
</jcr:root>

由于

1 个答案:

答案 0 :(得分:1)

只能使用getComponent() CQ.Ext.Container方法重新获得 itemId 的组件。 Dialog不是CQ.Ext.Container的子类。以下是有关此文档的摘录:

  

当没有对象引用可用时,itemId可用作获取组件引用的替代方法。不使用带有CQ.getCmp的id,而是将itemId与CQ.Ext.Container.getComponent一起使用,它将检索itemId或id。

findById()用于查找 id 而非 itemId 的组件。

对话框中的Tabpanel是CQ.Ext.Container类型的后代。如果你想使用itemId来获取引用,你首先应该引用它,然后在其上使用getComponent()方法。

var tab = dialog.findByType('TabPanel')[0]; //returns an array so taking the first element
var textfield = tab.getComponent('textfield1');

由于对话框中的字段已修复,并且您知道要查找第一个文本字段,因此可以直接执行

var textfield = dialog.findByType('textfield')[0]; // need not deal with id's at all.