Sapui5 全局模型不可访问

Sapui5 全局模型不可访问,sapui5,Sapui5,我在UI5应用程序的Component.js中声明了一个模型,如下所示 init:function(){ sap.ui.core.UIComponent.prototype.init.apply(this); var oModel1=new sap.ui.model.json.JSONModel(“model/mock.json”); setModel(oModel1,“oModelForSales”); }, 但无法在控制器内的任何onInit方法中访问模型,除非模型设置为“查看”,如下所示

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

init:function(){
sap.ui.core.UIComponent.prototype.init.apply(this);
var oModel1=new sap.ui.model.json.JSONModel(“model/mock.json”);
setModel(oModel1,“oModelForSales”);
},
但无法在控制器内的任何
onInit
方法中访问模型,除非模型设置为“查看”,如下所示:

var oModel1=new sap.ui.model.json.JSONModel(“model/routes.json”);
this.getView().setModel(oModel1);
controllers
onInit
sap.ui.getCore().getModel(“oModelForSales”)
的日志将模型显示为
未定义的
,但我能够在
onbeforeredering
处理程序中获取它


为什么在Component.js中设置的核心模型在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");
        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(这个);->调用createcontent方法,视图和控制器甚至在定义模型之前就已初始化,因此您将未定义为model。使用我的方法,我们首先创建模型,然后在组件中调用超级init方法


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

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

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

    this.getOwnerComponent().getModel()==this.getView().getModel()//返回:true
    
    注意:
    onInit
    中调用
    this.getView().getModel(/*modelName*/)
    ,因为视图还不知道它的父对象(
    this.getView().getParent()
    返回
    null
    )。因此,在
    onInit
    中,从拥有模型的父级显式调用
    getModel

    onInit:function(){
    const model=this.getOwnerComponent().getModel(/*modelName*/);
    //而不是这个.getView().getModel
    },
    
  • 如果其他地方不需要数据,则仅在某些控件(如视图、面板等)上设置模型

  • 仅当应用程序不基于组件时,才在核心上设置模型
如果核心模型或上层层次结构中的任何其他模型仍应传播到组件及其子级,请在实例化ComponentContainer时启用

新组件容器({
//...,
模型:正确
})
但同样,这不是一个好的做法,因为核心模型可能会被FLP上的其他应用程序盲目覆盖:

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



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

添加了有关此方面的更多信息:

在控制器的第九次
操作期间,视图/控制器不知道它们的父对象将在何处着陆,因此它们不能参考模型

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

this.getOwnerComponent().getModel()

因为组件已经初始化,应该返回模型。

我知道了,所以当我们在init函数中为组件设置模型时,比如init:function(){var workModel=new sap.ui.model.json.JSONModel(“model/workModel.json”);this.setModel(workModel,“workModel”);sap.ui.core.UIComponent.prototype.init.apply(这个,参数);}我们如何访问上面的“工作模型”对于属于itSo的所有其他控制器和视图,可以直接访问Component.js中的模型,而不显式地将模型设置为view?但上述给定行在控制器初始化方法的console.log中记录为undefined。确保在设置和获取模型时使用相同的名称。不应注册模型它在内核中是全局的,因为它可以被第三方代码覆盖,而第三方代码是您无法控制的