调用交叉控制器功能

时间:2016-03-26 20:25:09

标签: function view controller sapui5

我有两对控制器和视图。第一个视图包含项目列表,而第二个视图显示特定项目的一些详细信息。我想要实现的是单击一个列表项,onSelect函数应调用详细视图的第二个控制器并使用所选列表项更新其内容。

到目前为止,我有以下代码:

//first list controller
onSelect : function () {
var secondController = sap.ui.controller("controller.Detail");
secondController.updateFunction("some text");
}

然后在第二个控制器中:

//second detail-controller
updateFunction: function (someText) {
var view = sap.ui.xmlview("view.Detail");
view.byId("someTextField").setText(someText);
}

问题是这不起作用。似乎sap.ui.xmlview没有返回显示的同一视图。 当我执行以下代码时:

var model = view.getModel(model);
console.log(model);

在详细控制器的2个函数中,但首先由外部控制器调用,第二个由onInit调用或由详细视图事件调用的函数,id不同。

如何通过更新不同视图的内容来实现这种跨控制器功能调用?或者我的做法不合适?

3 个答案:

答案 0 :(得分:2)

我建议使用EventBusRouting进行视图间通信。

路由很好,因为它使用网址的hash part(#)进行通信,例如选择项目(f.e。https://example.com/myUi5App/index.html#/item/123)之类的事件。用户可以使用浏览器历史记录和书签来浏览您的应用。 视图可以注册到路由器,以便在匹配特定URL模式时得到通知。 “SAPUI5开发人员指南”中的演练可以逐步详细地解释路由,并详细解释herehere

EventBus 是一个可以发布任意事件的全局对象。有兴趣的人可以注册EventBus。 Component上有一个EventBus,如果你有一个组件和一个global EventBus,你应该使用它。

这两种技术都有助于解耦您的观点。如果有一个,很多或没有视图听取选择更改,则无关紧要。对于解雇事件的听众来说无关紧要。

答案 1 :(得分:0)

如果两个视图都被调用过,你可以通过视图实现这一点(从我的opionion来看,这非常hacky并且应该在其他方面解决)

this.getView().byId("yourViewId").oController.yourMethod();

表示你的情况

onSelect : function () {
  var secondController = this.getView().byId("view_id").oController;
  secondController.updateFunction("some text");
}

也许这会对你有所帮助,他正在传递控制器参考,这是一个更好的选择:Calling Controller Function from inside a press handler in sapui5

答案 2 :(得分:0)

我找到了解决方案。

sap.ui.getCore().byId("__xmlview1");

根据文档var view = sap.ui.xmlview("view.Detail");,始终会创建一个新视图。

但是我仍然在努力指定xmlview的id。自" ___ xmlview1"动态给出名称,数字1表示应用程序中的序列视图数。因此,如果我在创建" view.Detail"之前创建另一个视图,则id将指向新的。

我正在创建xmlview,如下所示:

<mvc:XMLView viewName="view.Detail"></mvc:XMLView>