我在Component.js中声明了UI5应用程序的模型,如下所示
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中访问
发布于 2017-02-15 13:59:41
如果使用组件,请避免直接在Core上设置模型。组件应该是独立的和可重用的部件,因此默认情况下,而不是将继承核心模型。应该根据您的业务情况来设置模型:
/sap.ui5/models中声明的模型将在组件上设置。它们会自动传播给它的后代。给定默认模型,以下内容返回true:
this.getOwnerComponent().getModel() === this.getView().getModel() //返回: true
注意:在onInit 未定义中调用this.getView().getModel(),因为视图还不知道它的父在那一刻 (this.getView().getParent()返回null)。因此,在onInit中,从拥有模型的父级显式调用getModel。例如:
{ // My.controller.js onInit:函数{/视图被实例化,但尚未分配父函数。这里无法访问来自父级的//模型。//从组件中显式地访问模型: const myGlobalModel = this.getOwnerComponent().getModel(/*modelName*/);},}如果核心模型或上层的任何其他模型仍应传播到组件及其子层,则在实例化propagateModel时启用ComponentContainer。
new ComponentContainer({ // required from "sap/ui/core/ComponentContainer"
//...,
propagateModel: true // Allow propagating parent binding and model information (e.g. from the Core) to the Component and it's children.
})但是,这也不是一个好的实践,因为核心模型可以被其他应用程序盲目地覆盖在FLP上,如SAP建议
不要,而不是,使用
sap.ui.getCore()注册模型。
关于在onInit中未定义的核心模型:从1.34.0版本开始不再是这种情况了。核心模型可以从控制器中的任何位置访问。但是,正如上面所解释的,ComponentContainer的后代在默认情况下并不知道这种模型。
https://stackoverflow.com/questions/33121909
复制相似问题