2016-05-27 3 views
1

Ich sehe, wie die Bindung von Expression zu verwenden.Verwenden Sie benutzerdefinierte globale Funktion in Expression Binding

https://sapui5.netweaver.ondemand.com/docs/guide/daf6852a04b44d118963968a1239d2c0.html

kann ich eine kleine Auswahl an Funktionsaufruf verwenden (können Sie Funktionen verwenden, die über globale Symbole zur Verfügung stehen, wie Math.max (...) oder isNaN (...).)

ich meine benutzerdefinierte Funktion isVisible(sParam) haben, aber ich möchte den sParam Wert direkt in den xML-Code schreiben (sParams ist im Modell nie), so etwas wie dieses

visible='{=isVisible('01 03 05 06')}' 

Meine Idee ist isVisible als globale Funktion aber in debuggen das Programm nicht kreuzen den Funktionscode

window.isVisible = function (sParam) { 
    ... 
}; 

Dies ist die doppelte Frage von Text string as params in a formatter function

Antwort

1

Es gibt nur bestimmte globale Objekte zu definieren und Funktionen erlaubt. Sie können eine Liste in der sourcecode sehen, die die Liste der globalen Symbole sein sollte, die Sie in der Dokumentationsverknüpfung finden, die Sie zur Verfügung gestellt haben.

Aber ich hatte nur eine Idee:

Mitglied Zugang Betreiber mit dem. Bediener

Sie können ein 'Dienstprogramm' JSONModel erstellen, das Funktionen enthält. Ein JSONModel nimmt nur ein JavaScript-Objekt und bietet Zugriff über Bindungspfad und Datenbindung an es. So greifen Sie auf das Wurzelobjekt über / und rufen eine Funktion auf der resultierende Objekt:

onInit:function(){ 
    var utility = { 
    isEven: function(x){ 
     return x % 2 === 0; 
    } 
    }; 
    this.getView().setModel(new JSONModel(utility), "utility"); 
} 
<Button text="Hello 1" visible="{:= ${utility>/}.isEven(1) }"/> 
<Button text="Hello 2" visible="{:= ${utility>/}.isEven(2) }"/> 

Sie können sogar die Steuerung über Schließung zugreifen.

Natürlich können Sie dieses Gebrauchsmuster auf einer höheren Ebene definieren (unter Component oder sogar unter Core). Sie können viele Gebrauchsmuster haben und Sie können Modelle in einem Ausdruck mischen: visible="{= ${utility>/}.doSomething(${bla>/blub}, 42) } (nicht versucht, dass).

Siehe Plunker für ein Beispiel

+0

Dies ist ein sehr kreativer Ansatz! Niemals jedoch ein JSONModel erstellen, das nicht nur JSON-Daten enthält, sondern auch JS-Funktionen – Qualiture

+1

Ich benutze 'intelligente Modelle', die JavaScript-Eigenschaften verwenden 'get bla() {...} set bla (x) {... } 'seit geraumer Zeit. Sie können wie jedes Attribut an diese Eigenschaften binden. Dies hilft wirklich, wenn Sie viele Abhängigkeiten und Einschränkungen haben. Sie können Summen etc. im laufenden Betrieb berechnen. – schnoedel

Verwandte Themen