我正在尝试新的ExtJs 5。 我根据ExtJs5定义的MVC模式创建了一个小应用程序。
每个ViewControllers
使用View
。
问题陈述:现在假设我有两个VC(Controller1& Controller2)。每个人都有自己的方法。我希望从Controller1调用Controller2的方法。我想从Controller1更新与Controller2关联的视图。
E.g. Suppose there is a separate view for Status Bar and a ViewController(StatusBarController).
This VC has a method to update the view based on whatever message it receives as input parameter.
All the other controllers in the application will call this VCs method to update the status of the application on the status bar.
在以前的版本中,this.getController('StatusBarController')
用于获取任何控制器的句柄,然后调用其方法。
但是当我使用ViewController时,这在我的情况下不起作用。
任何人都可以指导我如何实现这个目标吗?而且这是否是正确/理想的方式做这样的事情还是有更好的选择?
这是我的代码:
StatusBarView:
Ext.define('MyApp.view.statusbar.StatusBarView', {
extend : 'Ext.panel.Panel',
controller: 'StatusBarController',
region : 'south',
xtype : 'status-bar-panel',
html : 'This is a status bar'
});
StatusBarController:
Ext.define('MyApp.controller.StatusBarController', {
extend : 'Ext.app.ViewController',
alias: 'controller.StatusBarController',
updateStatusBar : function(message) {
this.getStatusBarView().update(message);
}
});
app中的其他控制器:
Ext.define('MyApp.controller.ResourcesPanelController', {
extend : 'Ext.app.ViewController',
alias : 'controller.ResourcesController',
onItemClick : function(tree, record, item, index, e, eOpts) {
// here I am calling the other controller's method.
this.getController('StatusBarController').updateStatusBar(
record.data.text + ' has been clicked');
}
});
答案 0 :(得分:8)
ViewControllers与他们的观点密切相关,他们甚至与视图一起创建和销毁,他们应该只控制他们自己的观点。我们的想法是在视图级别将逻辑与UI分开。
从另一个ViewController中调用一个ViewController的方法不是一个好习惯,对于大型应用程序来说,它是通往地狱的途径,因为它不可避免地导致无法维护spaghetti code。
正确的方法是最小化ViewModel,ViewControllers和Controllers的数量,让它们在自己的职责范围内工作。
例如:假设您想要一个容器中的网格和表单。表格将允许编辑在网格中选择的记录。再加上一些按钮。这三个视图(容器,网格和表单)一起形成一个单元。因此:
因此,如果需要,你可以拥有一个MVC(全局)控制器来协调单位的功能,比如我们的三人组。
此外,数据绑定在很大程度上简化了逻辑,因此不需要那么多的控制器和监听器。
答案 1 :(得分:0)
我的回答很简单: Ext.app.ViewController.fireEvent()
虽然可以使用ViewController的listeners配置添加任何类型的自定义事件 - listen配置状态"事件域"的文档,所以我'假设两个控制器都需要驻留在同一个域中,以便能够在事件中进行交互。
.fireEvent()的第二个参数可能需要模仿普通触发事件的元素。
好吧,也应该可以像那样访问它(在辅助控制器中):
this.getApplication().getStatusBarController().updateStatusBar('...');