2015-10-14 2 views
2

Я объявил модель в Component.js из приложения UI5, как показано нижеДоступ к глобальной модели от OnInit метода контроллера

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"); 
}, 

, но был не в состоянии получить доступ к модели в любом из onInit методов в контроллерах, если только модель устанавливается на виду, а не как показано ниже:

var oModel1 = new sap.ui.model.json.JSONModel("model/routes.json"); 
this.getView().setModel(oModel1); 

журнал для sap.ui.getCore().getModel("oModelForSales") в контроллерах onInit показывает модель как undefined, но я был в состоянии для его получения в обработчике onBeforeRendering.

Почему основные модели, установленные в Component.js, недоступны в onInit?

ответ

-1

вы можете один раз попробовать этот код -

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); 
    }, 

, а затем в вас инициализации метод любого контроллера TRY -

console.log(sap.ui.getCore().getModel("oModelForSales")); 

Я думаю sap.ui.core.UIComponent.prototype.init. apply (this); -> вызывает методы создания контента, а ваш просмотр и контроллеры инициализируются еще до того, как ваша модель определена, поэтому вы получите неопределенное значение как модель. Используя мой подход, мы сначала создаем модель, а затем вызываем метод super init в Component.

Note @ Admins-> У меня нет достаточного количества баллов для комментариев, поэтому добавление ответа.

+1

вам не следует регистрировать модели по всему миру в ядре, так как это может быть перезапись от третьего стороннего кода, который вы не контролируете –

1

Нельзя устанавливать модель на ядро.

Вместо этого установите его в компонент. Таким образом, контроллеры и представления, принадлежащие этому компоненту, смогут получить к нему доступ.

+0

Привет, я получил его, поэтому, когда мы установили модель для компонента в функции init, как показано ниже: функция() { var workModel = new sap.ui.model.json.JSONModel ("model/workModel.json"); \t \t это.setModel (workModel, "workModel"); \t \t sap.ui.core.UIComponent.prototype.init.apply (это, аргументы); \t} Как мы можем получить доступ к приведенной выше «рабочей модели» для всех остальных контроллеров и представления, принадлежащих ей – user3349850

+0

this.getView(). GetModel («workModel») – hirse

+0

Таким образом, модель в Component.js может быть напрямую доступна без установка модели явно для просмотра? но указанная выше строка регистрируется как неопределенная в console.log в методе инициализации контроллера. – user3349850

6

Избегайте установки моделей на ядре напрямую, если вы используете Компоненты. Компоненты должны быть независимыми и повторно используемыми частями и поэтому не наследуют основные модели по умолчанию. Модели должны быть установлены в зависимости от вашего бизнеса случае:

  • Модель, определенная в app descriptor (manifest.json) будет установлена ​​на компоненте. Они автоматически распространяются на своих потомков. Данная модель по умолчанию, следующие возвращает истину:

    this.getOwnerComponent().getModel() === this.getView().getModel() // returns: true 
    

    Примечание: Вызов this.getView().getModel(/*modelName*/) в onInitwill still return undefined, так как вид не знает своего родителя at that moment еще (this.getView().getParent() возвращается null). Таким образом, в onInit, API-интерфейс getModel должен быть вызван явно через родитель, которому принадлежит модели:

    onInit: function() { 
        const model = this.getOwnerComponent().getModel(/*modelName*/); 
        // instead of this.getView().getModel 
    }, 
    
  • Набор модели только на определенные элементы управления (например, зрение, панель и т.д.), если данные не нужен в другом месте ,

  • Установите модели на ядре только в том случае, если приложение не основано на компонентах (например, для демонстрации на JSBin).

Если модели сердечника или любая другая модель от верхней иерархии еще должны распространяться на компонент и его ребенок, позволяет propagateModel при инстанцировании ComponentContainer.

new sap.ui.core.ComponentContainer({ 
    //..., 
    propagateModel: true 
}) 

Но опять же, это не очень хорошая практика, так как модели Core могут быть легко перезаписаны другими приложениями, например. на Fiori Launchpad как SAP recommends:

ли не использовать sap.ui.getCore() для регистрации моделей.


О модели ядра быть определено в onInit: Это больше не так, как в версии 1.34.0. Модель Core может быть доступна из любого места контроллера. Однако потомки ComponentContainer не знают о таких моделях по умолчанию, как описано выше.

2

Добавление больше информации об этом:

Во время onInint контроллера, вид/контроллеры не знают своих родителей, как, где бы они землю, и, следовательно, они не могут относиться к модели.

Однако, это может быть достигнуто с помощью следующего кода:

this.getOwnerComponent().getModel() 

Как компонент уже инициализирован и должен возвращать модель.

Смежные вопросы