Accesso al modello globale dal metodo onInit del controller

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.

    • Imposta modelli sul Core solo se l’app non è basata su componenti.

    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.