2016-03-22 16 views
0

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.

Antwort

1

Ihr Ansatz sieht interessant aus und ich denke, es könnte eine gute Idee sein.

Nun zu Ihrem konkreten Problem: Sie sind ein . vor Ihrer Handler-Funktion fehlen:

  • Namen (mit einem Punkt beginnen: .navigation.onNavBack

    vom Developer Guide Zitiert '') werden immer als eine Methode im Controller angesehen.

  • Namen, die einen Punkt an einer späteren Position enthalten, werden als globale Funktionen betrachtet
  • Namen ohne Punkt werden als relativer Name interpretiert; Wenn nichts gefunden wird, werden sie als absoluter Name interpretiert.

Was bedeutet,
onNavBack wird die Funktion in der Steuerung verwenden, wenn es ein und halten ein Blick auf andere Weise;
.onNavBack erwartet eine Funktion in der Steuerung;
navigation.onNavBack wird nur suchen Sie nach einer globalen Funktion;
.navigation.onNavBack ist, was Sie verwenden möchten.

+0

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

+0

Im Bereich des Handlers kann 'this' Ihre Controller-Instanz sein. – hirse

+0

yay! das stimmt, es funktioniert! –

1

Ich denke, der folgende Aufruf kann nicht funktionieren:

this.navigation = new Navigation(this); 

Dies kann nicht funktionieren, weil Ihr Helfer sap.cre.core.ui.controller.helpers.Navigation keinen Konstruktor deklarieren, die den einen Parameter übernehmen könnte, die Sie (die Referenz auf dem Controller) sind vorbei . Ich nehme an, Sie gehen davon aus, dass new Navigation(this); Ihr onInit (...) aufrufen wird und aufgrund einiger Magie die Referenz zu Ihrem Controller übergeben wird. Aber das ist nicht richtig. Stellen Sie sicher, dass Sie einen Konstruktor deklarieren. Weitere Informationen finden Sie unter sap.ui.base.Object. In Ihrem Fall wird jeder Anruf an onNavBack zu einem Fehler führen, weil Ihre this._controllerundefined ist, richtig?

Ich habe einen ähnlichen Ansatz in der Vergangenheit zusammen mit sap.ui.define verwendet. Aber anstatt sap.ui.base.Object.extend (...) zurückzugeben, habe ich nativen OO JavaScript ... Das half mir, sap.ui.base.Object loszuwerden. Sie könnten jedoch auch einen guten Grund haben, um diese Abhängigkeit zu halten ...

0

Alles, was Sie tun müssen, ist den Konstruktor von Navigation.js neu definieren

constructor: function(controller) { 
     this._controller = controller; 
    }, 

Jetzt haben Sie einen Verweis auf die Hauptsteuerung ..

Verwandte Themen