javascript 在 SAPUI5 中实例化片段时传递另一个控制器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27095330/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 06:55:57  来源:igfitidea点击:

Pass another controller when instantiating a fragment in SAPUI5

javascriptcontrollerfragmentsapui5

提问by njames

In the SAPUI5 / OpenUI5 xmlfragment documentationthe third parameter is a controller for handling actions from the fragment.

在 SAPUI5 / OpenUI5 xmlfragment 文档中,第三个参数是用于处理来自片段的操作的控制器。

This is critical for a dialog fragment where there are buttons to press etc.

这对于有按钮可按下等的对话框片段至关重要。

Most of the time I have seen this instantiated as thisor sap.ui.getCore().byId('<element>').getController())

大多数时候我看到这个实例化为thissap.ui.getCore().byId('<element>').getController())

See an example at Fragment not get correct Controller

请参阅Fragment 中的示例未获得正确的控制器

Because of the complexity in a particular dialog I would like to have a separate controller for it.

由于特定对话框的复杂性,我想为它设置一个单独的控制器。

I have looked around at this and had a few attempts but so far not successful.

我环顾四周并进行了一些尝试,但到目前为止还没有成功。

I have put a working example on githubof using this.

我在github上放了一个使用this.

But I would like to instantiate Dialog.jsas the controller for the Dialog.fragment.xmlfrom initial.view.controller

但我想实例Dialog.js化为Dialog.fragment.xmlfrom的控制器initial.view.controller

Any takers?

有接班人吗?

Pull requests gladly received.

很高兴收到拉取请求。

The Crux of the example is as follows (this is the initial.controller.js) :

例子的关键如下(这是initial.controller.js):

sap.ui.controller("sc.test.view.initial", {

oDialog: null,

openTestDialog: function(){
    console.log("in open dialog");
     // instantiate the other controller
     var oDialogController = new sc.test.view.Dialog();
    // this next commented line is the 'normal' way to do it
    // oDialog = new sap.ui.xmlfragment( "sc.test.view.Dialog", this);  //oDialogController);
    // this is what I would like to achieve
    oDialog = new sap.ui.xmlfragment( "sc.test.view.Dialog", oDialogController);
    oDialog.open();
},       


onCartDialogCancel:function(oEvent){
// this function would then be in the other controller but how to get a handle on the dialog?
    oDialog.close();

}

});

});

Thanks.

谢谢。

采纳答案by qmacro

(Just got to SYD airport)

(刚到SYD机场)

All you're missing is the

你所缺少的只是

jQuery.sap.require("sc.test.view.Dialog");

in your initial.controller.js.

在您的initial.controller.js.

Pushed a quick fix in a branch to your repo and opened a PR

将分支中的快速修复推送到您的存储库并打开了PR

回答by Jasper_07

only example i could find close to yours was in the Material Shortage Fiori app

我在 Material Shortage Fiori 应用程序中可以找到与您的相似的唯一示例

  oCtrl = sap.ui.controller("myapp.fragments.DirectCallDialog");
  oDirectCallDialog = sap.ui.xmlfragment("myapp.fragments.DirectCallDialog", oCtrl);

lots of examples of injecting a controller when the fragment was called from a helper class. The helper class promotes reuse, eg same dialog fragment can be called from multiple views/components. The helper class method for the dialog setup is called from within a controller and the oController parameter is set to 'this'.

当从辅助类调用片段时注入控制器的许多示例。helper 类促进重用,例如可以从多个视图/组件调用相同的对话框片段。对话框设置的助手类方法从控制器内调用,oController 参数设置为“this”。

hth jsp

第一个jsp

回答by KynanJ

I copied an existing controller.js, and renamed it.

我复制了一个现有的 controller.js,并重命名了它。

Then, instantiated that as a below, and passed it through with the fragment.

然后,将其实例化为下面的,并通过片段传递它。

var oNewController = new sap.ui.core.mvc.Controller("myProject.DialogController"); this._oDialog = sap.ui.xmlfragment("myPopup","myProject.fragments.myPopup", oNewController);

var oNewController = new sap.ui.core.mvc.Controller("myProject.DialogController"); this._oDialog = sap.ui.xmlfragment("myPopup","myProject.fragments.myPopup", oNewController);

All eventing is now handled in oNewController, rather than the previously used "this"...

所有事件现在都在 oNewController 中处理,而不是以前使用的“this”...