Ich mag würde, eine Struktur zu implementieren, wie unten, um eine "Base" Superklasse zu vermeiden:Zusammensetzung anstelle der Vererbung in Controller
Controller/Helfer/Navigation.js
sap.ui.define([
"sap/ui/base/Object"
], function(Object) {
"use strict";
return Object.extend("sap.cre.core.ui.controller.helpers.Navigation", {
controller: null,
onInit: function(controller) {
this._controller = controller;
},
onNavBack: function() {
this._controller.getRouter().navTo("home");
}
});
});
Controller/Something.controller.js
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/cre/core/ui/controller/helpers/Navigation"
], function(Controller, Navigation) {
"use strict";
return Controller.extend("sap.cre.core.ui.controller.Something", {
onInit: function() {
this.navigation = new Navigation(this);
}
});
});
Dann wird die XML-Ansicht zeigt die onPress Ereignis wie folgt:
<semantic:FullscreenPage
navButtonPress="navigation.onNavBack"
showNavButton="true"> ...
Aber die Aussicht zu finden ist nicht das Ereignis, wenn auf navigation.
hingewiesen.
Also, meine Fragen sind:
- hat jemand bereits ein solcher Ansatz über OpenUI5/SAPUI5 gesehen?
- Gibt es eine schlechte Konsequenz?
- Was ist falsch in meinem Ansatz, dass die Ansicht
navigation.onNavBack
nicht aufrufen kann?
Vielen Dank!
Update:
ich auch auf diese Weise versucht:
Controller/Something.controller.js
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/cre/core/ui/controller/helpers/Navigation"
], function(Controller, Navigation) {
"use strict";
return Controller.extend("sap.cre.core.ui.controller.Something", {
navigation: new Navigation()
});
});
So wie @hirse vorgeschlagen Werke (Einlochen .
in Vor dem Pfad in der Ansicht), aber das lässt mich jede Verbindung zum Controller verlieren, was die Hilfsklasse zu begrenzt und größtenteils unbrauchbar macht.
Aber es lässt mich erraten, dass nur this.navigation = new Navigation(this)
fehlt etwas über Bindung auf dem Weg.
humm, wenn ein '.' in die Front gesetzt wird, wie' .onNavBack', tatsächlich funktioniert es; Wenn es jedoch in einen Namespace wie ".navigation.onNavBack" gestellt wird, funktioniert es auf die gleiche Weise immer noch nicht. Wenn ich 'navigation' als ein Attribut auf der gleichen Ebene wie 'onInit' deklariere, funktioniert es wie von dir vorgeschlagen, was bedeutet, dass durch das Setzen von' this.navigation' keine verbindlichen Prozeduren im ran gefunden werden. Problem bei diesem Ansatz ist, dass ich jede Verbindung zum Controller selbst vermisse, die für mich nutzlos bleibt:/ –
Im Bereich des Handlers kann 'this' Ihre Controller-Instanz sein. – hirse
yay! das stimmt, es funktioniert! –