我在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
中访问?
答案 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 moment(this.getView().getParent()
返回null
)。因此,在onInit
中,从拥有该模型的父级中明确调用getModel
:
onInit: function() {
const model = this.getOwnerComponent().getModel(/*modelName*/);
// instead of this.getView().getModel
},
如果其他地方不需要数据,则仅在某些控件(例如View,Panel等)上设置模型。
如果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->我没有足够的评论,所以添加一个答案。