2017-06-12 29 views
1

私はモジュール、eventbusを使用しているすべての流行語と全く混同しています。別のコントローラで1つのコントローラのメソッドを呼び出す?

私はこのフレームワークが初めてで、簡単な方法で理解したいので、より簡単な言葉で質問を言い換えようとします。だからここに私が達成しようとしているもの:

私はアンケートビューにバインドされているアンケートコントローラを持っています。今私は私のxsjsでバックエンドからいくつかのデータを取得し、このビューにバインドする必要があります。 Beforeレンダリングで私のajax呼び出しを使用しているので、私のajax呼び出しの完全なプロパティで、いくつかのvaildationsを実行する必要があるように、ページのレンダリング前にこのデータをフェッチする必要があります。完全なプロパティでの私の関数が長すぎるので、私は別のコントローラを作成し、次にajax呼び出しと必要な検証を行うメソッドを定義することを考えていました。この新しいコントローラはこのメソッド定義を保持しているだけなので、どのビューにもバインドされません。

Now Questionnaireコントローラでこのコントローラを呼び出す必要があります。コントローラメソッドでajax呼び出しを行い、検証を実行するメソッドを使用しますか?

​​

呼び出し、これと方法:

sap.ui.define([ 
"sap/ui/core/mvc/Controller", 
"sap/ui/model/json/JSONModel", 
"sap/m/MessageBox"], function(Controller, JSONModel, MessageBox) { 


var questionnaireResponseId; 
var password; 
var backendJSON; 

Controller.extend("OnlineQuestionnaire.controller.Questionnaire", { 

    onInit: function() { 
     jQuery.sap.require("jquery.sap.storage"); 

    }, 
    onBeforeRendering: function() { 
     questionnaireResponseId = jQuery.sap.storage.get("QuestionnaireResponseId"); 
     password = jQuery.sap.storage.get("Password"); 
     backendJSON = loadStack(questionnaireResponseId); //This is not correct way to call 
} 

この方法では、Questionnare.controller.jsであなたのQuestionStack.controller.jsを拡張QuestionStack.controller.js

loadStack(questionnaireResponseId) { 
jQuery.ajax({ 
       url: "", 
       method: "GET", 
       dataType: "json", 
       complete: this.onSuccess, 
       error: this.onErrorCall 
      }); 


return output; 
} 
+0

を他のコントローラは、任意のビューにバインドされていない場合は、なぜそれでありますコントローラ?それは単なる再利用可能なモジュールではありませんか? – amiramw

+0

Questionnaire.controller.jsで余分なコードを保持してコードの複雑さを減らすためのモジュールの種類 – loki

+0

メソッドonBeforeRenderingはデータをロードする場所ではありません。特定のルートが一致する場合は、ルーティングメカニズムを使用してデータをロードする必要があります。 – matbtt

答えて

1

で定義されています.loadStack(..);

+0

このようにして、COMPLETEコントローラをロードします。これにより、プロジェクトが特定の状態に達した場合にパフォーマンスの問題が発生する可能性があります。しないでください。私は別のアプローチを提供します。 – corax228

+0

lokiさんのコメント:「Questionnaire.controller.jsで余分なコードを保持し、コードの複雑さを減らすためのモジュールの種類」を参照してください。すべてそれを言う。拡張はちょうど正しいものです。しかし、どの州があなたのプロジェクトに手を届かせる必要があるのか​​、それがパフォーマンスの問題を引き起こすのではないのか? – n01dea

-2

//編集

ここに示した解決策は、あなたが確認する必要がありますので、この関数はイベントバスにいつでも(でも、コントローラがまだロードされていない)に登録され、余分な作業の多くの原因となります。あなたが100%確実であれば、コントローラがロードされます。他のコントローラで機能を再呼び出しする必要がある場合は、この機能を自由に使用してください。さもなければ、受け入れられた答えに固執しなさい。

必要なデータのみを読み込んでください!

1つの方法(または少なくともコントローラ全体ではない)が必要な場合は、必要な方法だけを読み込むようにしてください。これを実現するには、コールする前にまずメソッドをコアに登録する必要があります。

// your controller, which you want to load from 
sap.ui.define([ 
    // load your services here 
], function(/* service names */) { 
    "use strict"; 

    // register your function here 
    onInit: function() { 
     sap.ui.getCore().getEventBus().subscribe("myNamespace", "myFunctionName", this.myFunction, this); 
    }, 

    myFunction: function() { 
     // do stuff here 
    } 
}); 

はこちらをご覧ください詳細については方法

// working controller 
// now you can just use the following line, to call the method 
sap.ui.getCore().getEventBus().publish("myNamespace", "myFunctionName"); 

を呼び出すメソッドを登録します。https://openui5.hana.ondemand.com/#docs/api/symbols/sap.ui.core.EventBus.html

+0

-1これは私にとってのアンチパターンのように見えます。共通の機能を持っている場合は、ベースコントローラーを拡張するのが正しい方法です。このコンテキストでEventBusを使用することは有用ではありません。 – matbtt

+1

確かに、あなたは左足のつま先であなたの右の耳たぶに触れることができます。またはあなたの右手の指を使ってください。 – n01dea

+0

SAPはこのソリューションを自分で作成しました;)https://blogs.sap.com/2015/10/25/openui5-sapui5-communication-between-controllers-using-publish-and-subscribe-from-eventbus/ – corax228

関連する問題