比这更好的方法.View.Parent.Parent.oParent.oParent.setModel(foo,bar)?

时间:2014-12-29 09:36:37

标签: javascript sapui5

我想从我的一个组件控制器中将jsonModel设置为我的SAPUI5组件。在组件中,我正在使用app或splitapp。

我想避免按ID获取元素。什么是最接近" __ ComponentX"层次结构中的对象来自组件中的某个位置,因此无论多少级别的“父级”都是有效的。我很深,所以我可以在每个组件中使用相同的功能吗?

我是否应该要求对象返回一个oParent,只要它不返回null,或者是否有更快的方式在运行时花费更少的时间?

请让我澄清一下:我不希望我的子组件更改我的父组件,但我在讨论组件中的DOM树层次结构。我的DOM树从上到下(由sId)如下:__component0, __jsview0, __app0, __app0-Master, __jsview1.我想要一个函数来访问__component0,无论我是从__jsview0, __app0还是__jsview1调用它。

2 个答案:

答案 0 :(得分:3)

每个组件都应该在自己的沙箱中玩耍。因此,子组件不应负责访问和设置其父模型。如果组件紧密耦合或非常必要,则应通过事件处理此类通信。例如

// Fire ModelNeeded event on the control tree to inform responsible component
this.fireEvent("ModelNeeded", { modelName : "whatever" }, false, true); 

和componentX应该听它。

this.attachEvent("ModelNeeded", function(oEvent) {
     var sModelName = oEvent.getParameter("modelName");
     var oModel = createModel();
     this.setModel(oModel, sModelName);
     oEvent.stopPropagation();
});

答案 1 :(得分:0)

无论您的组件有多深,我都找到了解决问题的方法。

我创建了一个可以添加sapui5 jsview的函数,该函数根据所有者ID找到所有者(当你从组件内部操作时,它返回组件)。

function sourceComponent(oAny) {
  return sap.ui.getCore().getComponent(oAny._sOwnerId);
};