2017-09-15 13 views
0

私は、ルータ間でページを移動するためにルータを設定したマスター詳細ページアプリケーションを持っています。UI5キャッシュされたビューを破棄するルータ

App.view.xml

<SplitApp id="rootControl" detailNavigate="onDetailNavigation"> 
</SplitApp> 

manifest.jsonをアプリケーションは、単純な従業員のCRUDアプリです

"routing": { 
       "config": { 
        "routerClass": "sap.m.routing.Router", 
        "viewPath": "master", 
        "controlId": "rootControl", 
        "viewType": "XML", 
        "async":"true" 
       }, 
       "routes": [ 
        { 
         .... 
        }, 
        ... 
       "targets": {} 
        ... 

、私が作成/編集および用の別の1のための2つのルート1とルータを設定していますDispaly

私は1つのビューから別のビューに移動すると、ページの開始時など、すべての従業員と詳細ページを表示したマスターページを表示すると、ビューを破棄する必要があります。彼は従業員1です。

私はディスプレイ上の編集ボタンを持っています。私は押したときに表示ビューから編集ビューにナビゲートします。この時点で、キャッシュされたルータからディスプレイビューを破壊する必要があります。

これを実現するにはどうすればよいですか?または私はキャッシュを解決するために別のapprochを取る必要がありますか?または私は

が再び

Error: The object with ID __xmlview4 was destroyed and cannot be used anymore. 
+1

[削除](https://openui5.hana.ondemand.com/#/api/sap.m.SplitContainer/methods/removeDetailPage)の 'from'ビューを最初に削除してからそれを破棄するとどうなりますか?次回同じビューに戻ると同じエラーが発生しますか? – boghyon

+0

私は一度試してみましょう – chiranjeevigk

+0

以下を変更しました。 'var splitApp = this.getView()。byId(' rootControl '); \t \t \t splitApp.removeDetailPage(oEvent.getParameter( 'from'))); \t \t \t oEvent.getParameter( 'from')。destroy(); 'まだ同じエラー – chiranjeevigk

答えて

0

、私は@boghyonコメントを踏襲している以下のように私のコードでは、いくつかの変更を加えた詳細ページのナビゲーションなどの後にページを削除しています

var splitApp = this.getView().byId('rootControl'); 
splitApp.removeDetailPage(oEvent.getParameter('from')); 

やルータからキャッシュされたビューを削除するには、以下の私はいくつかのロジック

var router = this.getOwnerComponent().getRouter(); 
for(var view in router._oViews._oViews){ 
if(router._oViews._oViews[view].sId === oEvent.getParameter('fromId'){ 
delete router._oViews._oViews[view]; 
} 
} 

destrを書いていますビュー。

このようにすると、ビューを複数回読み込むことができますが、これは私の必要条件に適切な方法ではありません。@matbttの答えに従います。

ありがとうございます。

1

あなたが意見を破壊するコメントによると、同じビューに戻るエラー次の時間を与えSplitApp

onDetailNavigation : function(oEvent){ 
      console.log("Split app onDetailNavigation"); 
      oEvent.getParameter('from').destroy(); 
     } 

のonDetailNavigateを破壊呼び出ししようとしたメモリーを考えるべきではありません2つのビューによって割り当てられたメモリを節約します。私はこれが本当の利益をもたらすとは思わない。可能な解決策は3つあります。

  • 現在の解決策に固執します。
  • 単一のビューを使用して、表示フラグメントと編集フラグメントを切り替えます。例はhereです。
  • 入力フィールドのあるフォームで1つのビューを使用します。フォーム全体またはプロパティごとの編集または表示状態を反映するモデル(ビューモデルなど)のプロパティに対して編集可能な属性をバインドします。

<Input value="{applicationModel>/propertyName}" editable="{viewModel>/editable}"/>

私は第三ソリューションのバージョンを使用しています。私のアプリケーションモデル(JSONModelを拡張)は、アプリケーションデータとプロパティを制御する状態を保持します。コントローラは、状態を計算するアプリケーションモデルでsetEditableを呼び出すだけです。このアプローチを使用することで、ロジックをアプリケーションの多くの部分に広げないようにします。私の質問は、キャッシュされているルータからの眺めを破壊する程度ですので

<Input value="{applicationModel>/propertyName}" editable="{applicationModel>/Attributes/propertyName/editable}"/>

+0

表示項目ビューでは必要ではない入力項目に提案項目をロードする場合は、ロジックの有効化と無効化を処理するためにコントローラに書き込む必要があります。だから私の考えは、複数のビューは、コードと制御とコントローラメソッドの明確な分離を持っている – chiranjeevigk

+0

提案項目は、オンデマンドでロードする必要があります。したがって、結合表示/編集ビューに対しては引数がありません。表示モードでは提案を読み込まないだけです。コントローラーでコードが多すぎると心配する場合は、モデルに移動してください。 – matbtt

+0

私はこの感謝を捧げるが、この質問を閉じるために、私は@boghyonのコメントと答えに行くだろう。貴重なご意見ありがとう – chiranjeevigk

関連する問題