0

抱歉,如果没有正确命名,开发不是我的第一语言:)

我正在尝试向名为 Traccar(基于 Web 的跟踪平台)的 extjs Web 应用程序添加功能。

对于熟悉该应用程序的任何人,我正在尝试将“快速报告”按钮添加到设备部分,以便您可以单击设备,单击按钮,它将展开报告部分并预先选择报告类型为行程,设备为所选设备,然后单击显示。

从技术角度来看,我已经实现了其中的一些。我相信我需要关注两个视图控制器 - “DevicesController.js”(https://github.com/traccar/traccar-web/blob/9e1c0b44189136ec6abf05720c698027a689fa08/web/app/view/edit/DevicesController.js) js)和“ReportsController.js”(https://github.com/traccar/traccar-web/blob/9e1c0b44189136ec6abf05720c698027a689fa08/web/app/view/ReportController.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");
},

任何指针/指导/建议将不胜感激

4

2 回答 2

1

建议

从另一个控制器调用一个控制器是不行的。

控制器是一个 viewController,在创建视图以响应来自该视图的用户输入时创建。最坏情况:另一个视图不存在,因此未创建 viewController。


如果你真的必须

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

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

好多了

利用事件或设置您自己的事件总线

设置事件总线

在您的应用开始通话后

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

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

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

在接收视图控制器中,您之前设置了一个侦听器

onOtherViewControllerFire: function(args) {...}
init: function() {
    Traccar.Bus.on(eventName, this.onOtherViewControllerFire);
}
于 2022-02-09T21:27:34.347 回答
1

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

this.fireEvent('selectevent', position);

而在另一个地方订阅是这样的:

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

事件实际上在 Traccar 应用程序中被大量使用。您可以只搜索现有的用法。

于 2022-02-09T21:57:26.120 回答