2017-06-12 134 views
1

我完全同意所有使用模塊,事件總線的流行語。在另一個控制器中調用一個控制器的方法?

我會嘗試用更簡單的詞語來重新解釋我的問題,因爲我是這個框架的新手,我想以簡單的方式理解它。所以這裏是我想要實現的:

我有一個問卷控制器綁定到調查問卷視圖。現在我需要使用我的xsjs從後端獲取一些數據並綁定到此視圖。我需要在頁面呈現之前獲取這些數據,所以我在Before Rendering和我的ajax調用的完整屬性中使用了我的ajax調用,我需要執行一些vaildations。由於我在完整屬性中的功能太長,我正在考慮創建一個單獨的控制器,然後定義我的方法,它會在這裏進行ajax調用和必要的驗證。這個新的控制器只是擁有這個方法定義,因此它不被綁定到任何視圖。

現在我應該如何在調查問卷控制器中調用此控制器,並使用其調用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 
} 

這種方法在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

定義的Questionnare.controller.js擴展您的QuestionStack.controller.js:

​​

調用此方法.loadStack(..);

+0

這樣,您將加載完整控制器。如果您的項目達到特定狀態,這可能會導致性能問題!請不要這樣做。我會提供另一種方法。 – corax228

+0

請參閱loki的評論:「在我的Questionnaire.controller.js中保存額外代碼並降低代碼複雜性的模塊種類」。說完這一切。延伸正是正確的。但出於興趣,哪個國家需要您的項目達到,這會延長導致性能問題? – n01dea

-2

//編輯

這裏所示的方案會造成額外的工作很多,因爲你需要確保,該功能被註冊到事件總線中的任何時間(甚至,控制器尚未加載)。如果您100%確定,則在您需要在其他控制器中重新調用您的功能之前,您的控制器將被加載,請隨時使用此功能。否則,堅持接受的答案。

請只加載必要的數據!

如果您只需要一種方法(或者至少不是完整的控制器),則應該只加載所需的方法。爲了達到這個目的,你必須首先將你的方法註冊到核心,然後才能調用它。

註冊方法

// 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

相關問題