无法在片段对话框中获取控件

时间:2017-01-11 04:57:16

标签: javascript sapui5

我正面临以下问题。我有一个片段:

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core" xmlns:layout="sap.ui.layout" >
    <Dialog title="Hints" class="sapUiPopupWithPadding" contentWidth="60%">
        <content>
            <Table id="tblHintList" mode="SingleSelect" items="{HintList>/}" growing="true" growingThreshold="10" selectionChange="onGetSelectedHints">

            </Table>
        </content>         
    </Dialog>
</core:FragmentDefinition>

在我的控制器中,我想通过ID访问Table,如下所示:

var table = this.getView().byId("tblHintList");

即使我调用this.getView().addDependent(Fragment)并且数据绑定正在运行,这也无法正常工作。

如何访问片段中定义的控件?

2 个答案:

答案 0 :(得分:1)

通常,您必须区分这些use cases:片段是您视图的一部分。您正在使用或不使用ID来实例化您的片段。

在您的情况下,片段不是视图的一部分,因为它是一个对话框。在这种情况下,您将获得表控件,如下所示:

var table = sap.ui.getCore().byId("tblHintList");

假设您使用ID“myDialog”来实例化片段,如下所示:

var dialog = sap.ui.xmlfragment("myDialog", "my.package.HintListDialog");

然后你获得你的表格控件如下:

var table = sap.ui.core.Fragment.byId("myDialog", "tblHintList");

一般情况下,你应该自己组装控件ID,如前面的答案所示。

答案 1 :(得分:0)

this.getView().byId()无效,因为您的片段在实例化时未提供视图的ID。所以,让我们假设我有一个片段:HelloDialog。

<core:FragmentDefinition
   xmlns="sap.m"
   xmlns:core="sap.ui.core" >
   <Dialog>
        <content>
            <List id='myId'
            noDataText="No Products Found"
            title="Uraian"
            search="handleSearch"
            confirm="handleClose"
            close="handleClose"
            items="{
                path: 'list>/'
            }" >
                <StandardListItem
                    title="{list>Name}"
                    description="{list>ProductId}"
                    iconDensityAware="false"
                    iconInset="false"
                    type="Active" />
            </List>
        </content>
    </Dialog>
</core:FragmentDefinition>

我将以两种不同的方式实例化它(记住列表的ID是:myId)

  1. 实例化时没有任何ID:代码:

    oDialog = sap.ui.xmlfragment(&#34; testbed.HelloDialog&#34;); oView.addDependent(oDialog);

  2. 现在,如果您要检查DOM,列表的ID将只是myId。 因此,要在这些案例中获取ID,请使用:sap.ui.getCore().byId('myId').

    1. 使用ID实例化代码:

      oDialog = sap.ui.xmlfragment('fragmentId', "testbed.HelloDialog"); oView.addDependent(oDialog);

    2. 现在,如果您要检查DOM,列表的ID将为:fragmentId--myId

      在这里,您可以再次使用sap.ui.core.Fragment.byId("fragmentId", "myId"); ; //感谢matbtt

      现在,如果我将与我的片段一起使用的视图ID关联起来,即:

           var oView = this.getView();
           var oDialog = oView.byId("helloDialog");
           // create dialog lazily
           if (!oDialog) {
              // create dialog via fragment factory
              oDialog = sap.ui.xmlfragment(oView.getId(), "testbed.HelloDialog");
              oView.addDependent(oDialog);
           }
      

      DOM中的列表ID:viewId--myId

      现在,我可以使用我的this.getView().byId()作为this.getView().byId(),只需添加视图ID,然后搜索控件。

      P.S:你可以使用this.byId()而不是this.getView().byId()(这指的是控制器)。