Sapui5 全局模型不可访问
我在UI5应用程序的Component.js中声明了一个模型,如下所示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方法中访问模型,除非模型设置为“查看”,如下所示
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);
controllersonInit
中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 },
- 如果其他地方不需要数据,则仅在某些控件(如视图、面板等)上设置模型
- 仅当应用程序不基于组件时,才在核心上设置模型
新组件容器({
//...,
模型:正确
})
但同样,这不是一个好的做法,因为核心模型可能会被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。确保在设置和获取模型时使用相同的名称。不应注册模型它在内核中是全局的,因为它可以被第三方代码覆盖,而第三方代码是您无法控制的