全局模型不可接受

时间:2015-10-14 09:43:52

标签: sapui5

我在UI5应用程序的 Component.js 中声明了一个模型,如下所示

\0

但是无法在控制器内的任何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处理程序中获取它。

为什么 Component.js 中设置的核心模型无法在onBeforeRendering中访问?

4 个答案:

答案 0 :(得分:16)

如果您正在使用组件,请避免直接在Core上设置模型。组件是独立且可重复使用的部件,因此默认继承核心模型 。应根据您的业务案例设置模型:

  • 将在Component上设置app descriptor(manifest.json)中定义的模型。它们会自动传播到其后代。给定默认模型,以下内容返回true:

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

    注意:this.getView().getModel(/*modelName*/) will still return undefined中呼叫onInit,因为该视图尚未知道其父at that momentthis.getView().getParent()返回null)。因此,在onInit中,从拥有该模型的父级中明确调用getModel

    onInit: function() {
      const model = this.getOwnerComponent().getModel(/*modelName*/);
      // instead of this.getView().getModel
    },
    
  • 如果其他地方不需要数据,则仅在某些控件(例如View,Panel等)上设置模型。

  • 仅当应用基于组件时才在Core上设置模型。

如果Core模型或上层次结构中的任何其他模型仍应传播到Component及其子项,则在实例化ComponentContainer时启用propagateModel

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

但同样,这不是一个好习惯,因为Core模型可以被FLP上的其他应用程序盲目地覆盖为SAP recommends

  

使用sap.ui.getCore()注册模型。

关于onInit中未定义的核心模型:从版本1.34.0开始不再是这种情况。可以从控制器中的任何位置访问Core模型。但是,ComponentContainer的后代默认不知道这些模型,如上所述。

答案 1 :(得分:1)

您不应将模型设置为核心。

而是将其设置为Component。这样,属于该组件的控制器和视图就能够访问它。

答案 2 :(得分:1)

在此添加更多信息:

在控制器的onInint期间,视图/控制器不知道它们的父级将在何处着陆,因此它们无法引用该模型。

但是,这可以通过以下代码实现:

this.getOwnerComponent().getModel()

由于组件已经初始化并且应该返回模型。

答案 3 :(得分:-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);
    },

然后在任何控制器的init方法中尝试 -

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

我认为sap.ui.core.UIComponent.prototype.init.apply(this); - >调用创建内容方法,即使在定义模型之前,您的视图和控制器也会被初始化,因此您将未定义为模型。使用我的方法,我们首先创建模型,然后在Component中调用super init方法。

注意@ Admins->我没有足够的评论,所以添加一个答案。