2017-07-17 49 views
1

我使用2個XML片段,一個用於顯示數據,另一個用於編輯。從Fiori Launchpad導航後,碎片被破壞?

我用這個方法切換片段:

onAfterRendering : function() { 
    this._toggleForm("Display"); 
}, 

_toggleForm : function(sFragmentName) { 
    var oPage = this._detailPage; 

    //my detail page has an object header, a fragment form and a form in detail view. 
    if(oPage.getContent().length > 2) { 
     oPage.removeContent(1); 
    } 
    oPage.insertContent(this._getFormFragment(sFragmentName), 1); 
}, 

_formFragments: {}, 

_getFormFragment: function (sFragmentName) { 
    var oFormFragment = this._formFragments[sFragmentName], 
    oView = this.getView(); 

    if (oFormFragment) { 
     return oFormFragment; 
    } 

    oFormFragment = sap.ui.xmlfragment(oView.getId(), "namespace.fragment." + sFragmentName, this); 
    oView.addDependent(oFormFragment); 

    return this._formFragments[sFragmentName] = oFormFragment; 
} 

一切正常......可是,如果我叫該應用從菲奧裏啓動板,第一個電話是好的,但第二次給我這個insertContent中的錯誤:

ID爲XXX-detail-general的對象已被銷燬,無法再使用。

+0

爲什麼不使用表單元素的可編輯狀態?這比破壞和切換碎片更容易。你不這麼認爲嗎? –

+0

@AndriiNaumovych,謝謝你的建議,我在我的回答中更新了我的理由,如果有任何錯誤,歡迎您更正。 – Tina

回答

1

顯示/更改片段退出後破壞,但this._fromFragment仍然存儲的引用,並返回該引用oFormFragment噹噹我進入第二時間,這導致該錯誤_getFormFragment被調用。

通過新增固定:

 onExit : function() { 
      for(var sPropertyName in this._formFragments) { 
       if(!this._formFragments.hasOwnProperty(sPropertyName)) { 
        return; 
       } 

       this._formFragments[sPropertyName].destroy(); 
       this._formFragments[sPropertyName] = null; 
      } 
     } 

回答@AndriiNaumovych的問題:

似乎只有sap.ui.comp.smartform.SmartFormEditTogglable屬性,它需要metadata.xml中一個sap:updatable="true"(我在Explore中看到,未在doc中指定)

我使用sap.ui.layout.form.SimpleForm,editable似乎無法在沒有元數據的JSON模型中工作。所以我用this example與片段。