Ho dichiarato un modello in Component.js di un’applicazione UI5 come di seguito
init: function() { sap.ui.core.UIComponent.prototype.init.apply(this); var oModel1 = new sap.ui.model.json.JSONModel("model/mock.json"); sap.ui.getCore().setModel(oModel1, "oModelForSales"); },
ma non è stato in grado di accedere al modello in nessuno dei metodi onInit
all’interno dei controller, a meno che il modello non sia impostato sulla vista invece che sotto:
var oModel1 = new sap.ui.model.json.JSONModel("model/routes.json"); this.getView().setModel(oModel1);
Il log di sap.ui.getCore().getModel("oModelForSales")
nei controller onInit
mostra il modello come undefined
ma sono stato in grado di recuperarlo nel gestore di onBeforeRendering
.
Perché i modelli core, impostati in Component.js , non sono accessibili in onInit
?
puoi provare questo codice?
init:function(){ //sap.ui.core.UIComponent.prototype.init.apply(this); var oModel1 = new sap.ui.model.json.JSONModel("model/mock.json"); sap.ui.getCore().setModel(oModel1,"oModelForSales"); console.log(sap.ui.getCore().getModel("oModelForSales")); sap.ui.core.UIComponent.prototype.init.apply(this); },
e poi nel tuo metodo init di qualsiasi controller prova –
console.log(sap.ui.getCore().getModel("oModelForSales"));
Penso che sap.ui.core.UIComponent.prototype.init.apply (this); -> invochi i metodi di creazione del contenuto e la vista e i controller siano inizializzati anche prima che il modello sia definito, quindi si ottiene un modello non definito. Usando il mio approccio, prima creiamo il modello e poi chiamiamo il metodo super init in Component.
Nota @ Amministratori-> Non ho abbastanza punti per commentare, quindi aggiungere una risposta.
Evita di impostare i modelli direttamente sul Core se usi i componenti. I componenti devono essere parti indipendenti e riutilizzabili e quindi non erediteranno i modelli Core per impostazione predefinita . I modelli devono essere impostati in base al tuo caso aziendale:
I modelli definiti nel descrittore dell’app (manifest.json) verranno impostati sul componente. Vengono automaticamente propagati ai suoi discendenti. Dato il modello predefinito, il seguente risultato è true:
this.getOwnerComponent().getModel() === this.getView().getModel() // returns: true
Nota: la chiamata this.getView().getModel(/*modelName*/)
in onInit
verrà comunque restituita undefined
poiché la vista non conosce ancora il suo genitore in quel momento ( this.getView().getParent()
restituisce null
). Pertanto, in onInit
, chiama esplicitamente getModel
dal genitore che possiede il modello:
onInit: function() { const model = this.getOwnerComponent().getModel(/*modelName*/); // instead of this.getView().getModel },
Imposta i modelli solo su determinati controlli (es. Visualizza, Pannello, ecc.) Se i dati non sono necessari altrove.
Se i modelli Core o qualsiasi altro modello della gerarchia superiore devono ancora essere propagati al Component e ai relativi elementi secondari, abilitare propagateModel
durante l’istanziazione di ComponentContainer.
new ComponentContainer({ //..., propagateModel: true })
Ma ancora una volta, questa non è una buona pratica poiché i modelli Core possono essere ciecamente sovrascritti da altre app su FLP come SAP consiglia :
Non utilizzare
sap.ui.getCore()
per registrare i modelli.
Informazioni sul modello Core non definito in onInit
: questo non è più il caso dalla versione 1.34.0. È ansible accedere al modello Core da qualsiasi posizione nel controller. Tuttavia, i discendenti di ComponentContainer
non sono a conoscenza di tali modelli per impostazione predefinita, come spiegato sopra.
Non dovresti impostare il Modello sul Core.
Piuttosto, impostalo sul componente. In questo modo i controllori e le viste appartenenti a quel componente saranno in grado di accedervi.
Aggiunta di maggiori informazioni su questo:
Durante onInint
di un controller, la vista / i controller non conoscono il loro genitore come dove atterrerebbero, e quindi non possono riferirsi al modello.
Tuttavia, questo può essere ottenuto dal seguente codice:
this.getOwnerComponent().getModel()
Poiché il componente è già inizializzato e deve restituire il modello.