2015-07-24 15 views
6

Utilizzando OpenUI5/SAPUI5, per documentazione su XML Binding Expressions, è possibile eseguire una funzione dalla vista.Funzione controller di chiamata dall'espressione di binding XML

new sap.m.CheckBox({ 
    selected: "{= checkSelectedItems(${odata>CustomerId}) }" 
}) 

Nel mio controller dietro la vista:

checkSelectedItems: function(sCustomerId) { 
    return true; 
} 

A mio parere, ho l'errore generico come se non riesce a trovare la mia funzione:

Uncaught TypeError: Cannot read property 'apply' of undefined 

ho provato a chiamare la funzione in diversi modi:

{= .checkSelectedItems() } 
{= my.namespace.checkSelectedItems() } 

Ho anche provato ad aggiungere una funzione in un tag di script nella mia pagina indice per vedere se ha solo accesso alle funzioni globali, ma non sono stato in grado di attivarlo. Suggerimenti? Sto interpretando male la documentazione?

Vedere il raccoglitore JS qui: http://jsbin.com/sosotacihi/edit?html,output. Ho commentato il CheckBox che presenta il problema, ma se lo inserisci, vedrai l'errore.

+1

Ho fatto progressi lenti, apparentemente il modo corretto per chiamare una funzione è come '{= f (checkSelectedItems, null, $ {odata> CustomerId})}' dove il primo parametro di 'f()' è il tuo il nome della funzione, il secondo è la funzione di formattazione per i parametri, mentre il terzo è un array di parti da passare alla funzione. Tuttavia, sto ancora lottando con una funzione indefinita. – mitch

risposta

2

È necessario utilizzare il formattatore per chiamare i metodi del controller da una vista XML.

new sap.m.CheckBox({ 
    selected: "{parts:['odata>CustomerId'], formatter:'.checkSelectedItems'}" 
}); 

Questo può essere applicato a qualsiasi attributo di attivazione evento. Il modo generico di menzionato questo è:

{parts:['<parameter1>', '<parameter2>', ...], formatter:'.<methodInController>'} 
+0

Ho imparato molto nell'ultimo anno e sono d'accordo: la funzionalità che stavo veramente cercando è fornita dal concetto di una funzione di formattazione. – mitch

0

UI5 Suggerisce di utilizzare il binding di espressioni anziché le funzioni del formattatore. Il collegamento Expression è principalmente per le viste XML non per le viste JS.

+0

Il binding di espressioni è ancora visualizzato ed eseguito nella vista, indipendentemente dal fatto che sia stato impostato in JS o XML. Inoltre, come è il sopra non è un'espressione vincolante? – mitch

+0

Non sicuro, cosa intendi per esecuzione nella vista? –

+0

Supponiamo che io abbia dichiarato il ComboBox in XML invece di JavaScript come vedi sopra. Questo cambia la tua risposta? – mitch

0

Per riutilizzare una funzione di controllo in un'espressione vincolante, il complesso sintassi di associazione funziona anche qui:

selected="{= ${parts: [{path: 'myModel>property'}], formatter: '.myMethodInController'} === 'foo'}" 

Attualmente, funziona solo quando parts:[{path: ...}] è incluso . Ma ovviamente, solo perché funziona, non significa che dovremmo usarlo. Come puoi vedere, tale associazione di espressioni può diventare rapidamente illeggibile.
UI5 suggerisce di attenersi a una funzione formattatore se il binding di espressioni diventa difficile da leggere.

Si consiglia di utilizzare le funzioni di formattazione invece di espressioni molto complesse e di difficile lettura.

Controllare questo documentation.


La sintassi someFn(...) in un legame espressione funziona solo se someFn è uno dei simboli globali, come Math.max(...) o isNaN(...).