ExtJS 6让ViewController相互通话

时间:2015-10-22 11:31:11

标签: events extjs viewcontroller extjs6

我有两个ViewController。 如果我在树形图中选择一个项目,则第一个会触发事件:

// treeController

    onItemSelection: function(treeview, record) {
        var me = this,
            controller = me.getView().getController();

        ...

        controller.fireEvent('myEvent', record);
    }

第二个是听这个事件。 控制器负责将文件上载到指定的URL。 此URL由onMyEvent函数设置。

// uploadController

    ...    
    listen: {
            controller: {
                '*': {
                    myEvent: 'onMyEvent'
                }
            }
        },

        defaultUrl: 'foo/bar/{id}',
        currentUrl: null,

        onMyEvent: function(record) {
            var me = this;
            me.currentUrl = me.defaultUrl.replace('{id}', record.getId());
        },

        onUploadClick: function (form) {
            var me = this;
            if (form.isValid()) {
                form.submit({
                    url: me.currentUrl,
                    ...
                });
            }
        },
    ...

我想要实现的目标: 我在treepanel中选择一个项目 - >事件被触发,onMyEvent函数已被执行。

我点击按钮打开uploadView(连接到控制器的视图)。之后,我点击文件上传按钮,选择一个文件,然后点击上传按钮。 按下upload按钮后,控制器应调用onUploadClick函数并使用先前放置的url(currentUrl)进行上载。

我面临的问题:

  1. 选择treepanel中的项会触发事件,但uploadController不执行onMyEvent函数。 当我首先打开uploadView并在面板中选择一个节点后,执行onMyEvent函数。

  2. 当我使用第二种方法并尝试上传文件时,我收到一条错误消息,告诉我我没有指定该网址(它为空)。

  3. 如何在不使用上述解决方法的情况下完成此过程。?

    提前致谢。

1 个答案:

答案 0 :(得分:1)

您的活动myEvent位于UploadController。但是,controller.fireEvent('myEvent', record);会尝试在TreeController中找到并触发它。

此问题的根本原因是controller = me.getView().getController();将返回this / TreeController的实例。当您执行me.getView()时,它会为您提供TreeView,而me.getView().getController()会返回TreeController的实例,您需要UploadController myEvent的实例{1}}是UploadController的事件。

您首先打开UploadView时触发事件的原因是因为您已经在UploadController

希望有所帮助!