ExtJS控制器交互

v64noz0r  于 2022-09-26  发布在  其他
关注(0)|答案(2)|浏览(135)

如果术语不正确,请道歉,开发不是我的第一语言:)
我正在尝试向名为Traccar(一个基于web的跟踪平台)的extjs web应用程序添加功能。
对于熟悉该应用程序的任何人,我想做的是在设备部分添加一个“快速报告”按钮,以便您可以单击一个设备,单击该按钮,它将展开报告部分,并预先选择报告类型为trips,设备为所选设备,然后单击show。
从技术Angular 来看,我已经做到了一些。我认为我需要关注两个视图控制器——“DevicesController.js”(https://github.com/traccar/traccar-web/blob/9e1c0b44189136ec6abf05720c698027a689fa08/web/app/view/edit/DevicesController.js)和“ReportsController.js”
我已经解决了如何展开屏幕底部的报告部分(这相当简单):

onQuickReportClick: function() {

  Ext.getCmp('reportViewPanel').expand(true);

},

我一直试图打电话给报表管理员与之交互,但我似乎无法了解如何做(如果你能做到的话)。我一直在尝试这样的事情-

var reportController = Traccar.app.getController("Traccar.view.ReportController");
    reportController.test();

但是,我遇到了这样的错误

```    Uncaught TypeError: controller.doInit is not a function
```    at constructor.getController (ext-all-debug.js:95199:28)
```    at constructor.onQuickReportClick (DevicesController.js:109:38)
```    at Object.callback (ext-all-debug.js:8705:32)
```    at constructor.fireHandler (ext-all-debug.js:144259:17)
```    at constructor.onClick (ext-all-debug.js:144241:16)
```    at constructor.fire (ext-all-debug.js:20731:42)
```    at constructor.fire (ext-all-debug.js:34336:27)
```    at constructor.publish (ext-all-debug.js:34296:28)
```    at constructor.publishDelegatedDomEvent (ext-all-debug.js:34318:14)
```    at constructor.doDelegatedEvent (ext-all-debug.js:34361:16)

目前的测试方法非常简单,只是为了证明我已经做到了-

test: function () {
    showToast("test - succsfully in report controller", "test");
},

如有任何建议/指导/建议,我们将不胜感激

syqv5f0l

syqv5f0l1#

建议

从另一个控制器调用控制器是NoGo。
控制器是一个viewController,在创建视图以响应该视图中的用户输入时创建。最糟糕的情况:另一个视图不存在,因此尚未创建viewController。

如果你真的需要

你想关注Peters的评论并运行:

Ext.first('reportView').getController()
// or faster and prefered
// add an id to the view => reportViewId
Ext.getCmp('reportViewId').getController()

好多了

利用事件或设置自己的Eventbus

设置事件总线

应用程序启动呼叫后

Traccar.Bus = new Ext.util.Observable();

有了它,您可以在一个viewController中触发事件:

/**
 * @param {string} eventName
 * @param {object} args
 */
Traccar.Bus.fireEvent(eventName, args);

在接收viewController中,您之前设置了一个侦听器

onOtherViewControllerFire: function(args) {...}
init: function() {
    Traccar.Bus.on(eventName, this.onOtherViewControllerFire);
}
btqmn9zl

btqmn9zl2#

您可以使用事件。实际上,您不需要为此设置总线。你可以这样称呼:

this.fireEvent('selectevent', position);

然后在另一个地方订阅:

config: {
        listen: {
            controller: {
                '*': {
                    selectdevice: 'deselectEvent',
                    selectreport: 'deselectEvent'
                },

事实上,Traccar应用程序中经常使用事件。您可以只搜索现有的用法。

相关问题