2016-12-07 8 views
1

私はチュートリアルに従いましたが、今はその学習を実際のアプリケーションに拡張しようとしています。私のアプリではJSONモデルを使用しています。チュートリアルとは異なり、私は実際のアプリケーションであり、データモデルをロードするときにフィルタとして機能するようにユーザーの資格情報を取得する必要があります。チュートリアルでは、モデルはcomponent.jsに読み込まれます。私のアプリでは、ユーザーのIDとパスワードを入力する必要があるので、アプリケーションの最初のビューよりもモーダルに表示されるログインフラグメントがあります。これはマスタービューになります。これは、 component.jsの後には批判的にです。ユーザーを検証した後、サーバーからJSONデータをAjax経由で収集し、this.setData(my_json)を介してデフォルトモデルに配置します。this.setModel()がコンテキストに基づいて異なる動作をする理由

詳細ビューで呼び出されたthis.getModel()が空のモデルを作成したという点で、私は徹底的なバグを作りました。私はモデルをマスタビューに設定して、テーブルコントロールのデータを見ることができます。何が得られますか?

私はルーティングの問題を考慮しましたが、それは問題ではないことを確認しました。ルータを通過するパラメータをログに記録でき、とにかく詳細ビューが表示されます。

要約:マスターページでthis.setModel()を使用し、詳細ページでthis.getModel()を使用しますが、後者は空のモデルです。

質問:モデルをアプリ全体で利用できるようにします。チュートリアルでは、component.jsでモデルを設定することに焦点を当てていますが、できません。たとえば、グローバルモデルをマスタービューから設定するための正しい構文、またはcomponent.js以外の任意の場所を設定する正しい構文は何ですか。

私は(最後の行は重要である)私はマスターに次のように使用する必要があると思う:

var oModel = new JSONModel(); // declare a JSON model 
oModel.setData(<json string>); // load a JSON string fetched from serve etc. 
sap.ui.getCore().setModel(oModel); // important - set as the core model 

私は私の混乱の源はチュートリアルで、モデルがコンポーネントに設定されているようだということだと思います

this.setModel(oModel); // a line in component.js 

介しIしたがってcomponent.js文脈におけるこのは理にかなっているに沿った図に関する図でこのながらアプリ大域あると仮定する。私は正しい?

答えて

3

this.setModel(...)のチュートリアルでは、Component.jsの内部でモデルをComponentに直接設定します。したがって、そのモデル内のすべてのビューでモデルが表示されます。

this.getView().setModel(...)がコントローラ内にあると、そのモデルはその1つのビューにのみ設定されていることがわかります(したがって、そのモデルは子供にも表示されます)。

コントローラ内にthis.setModel(...)のようなものがある場合は、this.setModel(...)の内部で何が起きているかを確認する必要があります。モデルがビュー、コンポーネント、または他の場所に設定されている可能性があります。いくつかのチュートリアルでは、いわゆる "BaseController"の概念を利用しています。これは基本的に他のコントローラの親コントローラであるため、このアプローチでは、このBaseControllerから継承する子コントローラで簡単に再利用できる便利なAPIを作成できます。たとえば、BaseController of the Worklist Appを見てください。ここで、setModel(...) APIがモデルをビューに設定していることがわかります。それは、そのBaseControllerから伸びているコントローラ内のthis.setModel(...)を呼び出すたびに、あなたのモデルがビューにセットされていることを意味します!

さらに、Master-Detailアプリケーションでは、MasterページとDetailsページ(親子関係)の間に階層がないため、マスタービューのモデルは詳細ビューに表示されません。

あなたのケースでは、コンポーネントをモデルに直接設定するのが最善のようです。これを行うには、コントローラーの中に

this.getOwnerComponent().setModel(...); 

を呼び出してください。または、Component.js like in the Wordlist tutorialで直接操作してください。後で、コントローラ内からいつでも、そのモデルにデータを伝播できます。

+0

ありがとうございました - 非常に明確で、将来的に参照する必要がある可能性が高いと思われるものは間違いありません。私がこの質問を提起する前に、getOwnerComponent()。getModel()を使って詳細ビューでモデルを取得しようとしましたが、getOwnerComponent()を使用してモデルをマスターからコンポーネントに設定したところで、 .setModel()。そんなに近かったし、まだまだ。 –

関連する問題