onBeforeRendering中调用的方法getPath返回undefined

时间:2017-04-07 17:30:25

标签: sapui5

我有一个列表报告,一旦选择了一个项目,就会提示输入一个对象页面。我没有使用FIORI Elements,一切都是从头开始创建的。 对象页面有一个静态标题,但其正文从一个项目更改为另一个项目。本质上,身体使用不同的片段,这些片段取决于所选项目的字段(位置类型)。换句话说:

  • Pos Type 1 --->片段A
  • Pos Type 2 --->片段B

要做到这一切,在对象页面的控制器上,我已经使用onBeforeRendering生命周期方法实现了以下内容:

    onBeforeRendering: function() {
        // // Set Fragment to be used
        var oLayout = this.getView().byId("ObjectPageLayout"), 
            oFragment = sap.ui.xmlfragment(this._fragmentName());
        oLayout.addSection(oFragment);  
    },
    _fragmentName: function() {
        var oModel = this.getView().getModel();
        var sPosType = oModel.getProperty(this.getView().getObjectBinding().getPath() + "/PositionType");
        var sFragment;

        if (sPosType === "1") {
            sFragment = "A";
        } else if (sPosType === "2") {
             sFragment = "B";
        }
        return sFragment;
    },

我面临的问题是此代码抛出以下错误消息:“未捕获(在承诺中)TypeError:无法读取未定义的属性'getPath'”

我发现使其工作的唯一方法是使用onInit,而不是使用onBeforeRendering方法。这样,getPath()工作正常。但是,如果用户返回列表报告,然后选择不同位置类型的项目,则对象页面将显示在上一个项目中使用的相同片段。

万一你想知道,下面你会找到对象视图:

<mvc:View height="100%" xmlns="sap.uxap" xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns:m="sap.m" xmlns:semantic="sap.m.semantic"
xmlns:forms="sap.ui.layout.form" xmlns:layout="sap.ui.layout" controllerName="objectview.controller"
xmlns:aud="sap.uxap.sample.SharedBlocks.fragmentblocks">
<semantic:FullscreenPage id="page" navButtonPress="onNavBack" showNavButton="true" title="{i18n>ObjectPageTitle}">
<m:Page title="Object Page Title">
    <m:content>
        <ObjectPageLayout id="ObjectPageLayout">
            <headerTitle>
                <ObjectPageHeader id="ItemTitle" objectTitle="Item Title">
                    <actions>
                        Some actions defined

                    </actions>
                </ObjectPageHeader>
            </headerTitle>
            <headerContent>
                Some Header Content
            </headerContent>
            <sections>

            </sections>
        </ObjectPageLayout>
    </m:content>
    <m:footer>
        <m:Bar>
            <m:contentRight>
                Buttons added to the Footer
            </m:contentRight>
        </m:Bar>
    </m:footer>     
</m:Page>
</semantic:FullscreenPage>

1 个答案:

答案 0 :(得分:0)

每次进入页面时都会在部分容器上添加新部分。

您可以在添加新部分之前删除所有现有部分。

oLayout.removeAllSections();
oLayout.addSection(oFragment);