onAfterRendering事件被调用两次& SAPUI5版本:" 1.46.8"

时间:2017-06-30 07:21:27

标签: sapui5 sap-web-ide

情景1:

sample.view.xml

<mvc:View xmlns:core="sap.ui.core" xmlns:l="sap.ui.layout" xmlns:f="sap.ui.layout.form" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m"
    controllerName="Sample.controller.EmpStat" xmlns:html="http://www.w3.org/1999/xhtml">
    <Page id="EmpStat" showHeader="false">
        <content>
    <HeaderContainer id="gridDOJ" scrollStep="200" scrollTime="200" orientation="Horizontal" height="65px"></HeaderContainer>
</content>
    </Page>
</mvc:View>

sample.controller.js

onAfterRendering: function() {
    alert("Test");      
}

注意: 此处afterRendering()事件被调用两次。

情景2:

sample.view.xml

<mvc:View xmlns:core="sap.ui.core" xmlns:l="sap.ui.layout" xmlns:f="sap.ui.layout.form" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m"
        controllerName="Sample.controller.EmpStat" xmlns:html="http://www.w3.org/1999/xhtml">
        <Page id="EmpStat" showHeader="false">
            <content>
    <l:Grid class="sapUiSmallMarginTop" id="gridDOJ" defaultSpan="L3 M4 S6">
            <l:content></l:content>
    </l:Grid>
</content>
        </Page>
    </mvc:View>

sample.controller.js

onAfterRendering: function() {
        alert("Test");      
}

注意: 此处afterRendering()仅调用一次事件。

为什么在场景1事件被调用两次?

1 个答案:

答案 0 :(得分:-1)

HeaderContainer 有一个从 sap.ui.core.control 借来的 onAfterRendering 类,因此在场景中,headerContainer 调用此方法一次,sap.m.Page 再次调用该方法。 处理这种情况的唯一方法是通过使用事件父源检查或使用我在下面给出的逻辑第二次绕过代码的执行,因为在大多数情况下,事件只会被调用两次。

可以在 onInit() 中创建一个计数器,然后在 onAfterRendering() 中更新值,只有当条件与计数器值匹配时才执行相应的代码。

onInit:function(){
   this.afterRenderingCount = 0;
}, 

onAfterRendering: function (oEvent) {
    if(this.afterRenderingCount === 1){
        this.afterRenderingCount =0;
        //method call
        this.exampleMethod();
     }
    this.afterRenderingCount++;
}