ODataサービス(manifest.jsonで宣言されている)を使用するマスター/詳細アプリケーションがあります。
詳細コントローラーでは、次の方法でモデルをビューにバインドします(このメソッドはルーターオブジェクトにアタッチされます)。
_onObjectMatched: function(oEvent) {
this.getView().bindElement({
path: "/ContractCompSet('" + oEvent.getParameter("arguments").id + "')",
model: "contracts"
});
}
このコントローラー内から実際のバインドされたモデルオブジェクトにアクセスするにはどうすればよいですか?
私が得た最も近いもの(しかし、少し複雑すぎるようです)は次のとおりです
var path = this.getView().getElementBinding('contracts').sPath.substring(1);
var model = this.getView().getModel('contracts').oData[path];
さて、あなたのアプローチはそれほど遠くないです、そして確かにhirsesとほとんど同じです。
重要なのは、バインディングにはバインドされたモデルオブジェクトが「ただ」含まれていないということです。モデル、「バインドされたオブジェクト」へのパス、およびコンテキストに関する情報が含まれています。これらはバインディングから取得できます。 「バインドされたオブジェクト」にアクセスするには、基本的に2つのパスを使用できます。
バインディングからモデルとパスを取得し、モデルを介して「バインドされたオブジェクト」にアクセスします:(これはあなたと彼が概説したものです)
var path = this.getView().getElementBinding('contracts').sPath;
var boundObject = this.getView().getModel('contracts').getProperty(path);
または、コンテキストとパスを取得して、その方法で「バインドされたオブジェクト」にアクセスします。
var context = this.getView().getElementBinding('contracts').oContext;
var boundObject = context.getProperty(context.getPath());
これについて多くの研究をしなかったので、私は2番目のオプションを好むでしょう。それは、コンテキストバインディングがどのように意図されているかという線に沿っているように見えます。
私は思ったでしょう、
this.getView().getModel('contracts')
モデルオブジェクトを提供します(タイプsap.ui.model.Model
またはサブクラスのオブジェクトのように)。
モデル内のデータを参照している場合は、以下を使用できます。
this.getView().getModel('contracts').getProperty("/")