Sencha - 如何通过返回的New Ext.Button调用控制器方法

时间:2018-03-25 21:24:43

标签: extjs extjs6

Bellow代码是在Stackoverflow中搜索它并找到它的结果:

How to add button in Grid view column in extjs?

但事实证明它产生了一些我无法找到答案的问题;(。

所以,我需要做的是让网格包含如下数据:taskId,task StartTimestamp,task EndTimestamp,result(这可以实际显示为任务状态(" pending",&#34) ;错误","拒绝")和状态"完成"我实际上需要显示一个按钮,如下面的代码所示,点击后点火方法生成pdf )。

我有MVC结构:

视图被定义为Ext.define(' MyApp.meta.requests.view.MetaRequests' {some stuff},并且我在内部声明了控制器如下控制器:' metaRequests' ,wchich被声明为Ext.define(' MyApp.meta.requests.controller.MetaRequestsController',{some stuff}

如果我尝试从按钮中的控制器调用任何方法,如下所示:

renderer: function (value, metaData, record) {
    var status = record.get('status');
    if (status === 'DONE') {
         var id = Ext.id();
         Ext.defer(function(){
            new Ext.Button({
                padding: 0,
                text: 'PDF',
                iconCls: 'x-fa fa-download',
                **handler :** 'loadMetaRequests'
            }).render(document.body, id);
         },50);
         return Ext.String.format('<div id="{0}"></div>', id);
    }
    if (status === 'QUEUED') {
        metaData.tdCls = 'queued-status';
        return status;
    }
    if (status === 'PENDING') {
        metaData.tdCls = 'pending-status';
        return status;
    }
    if (status === 'REJECTED') {
        metaData.tdCls = 'reject-status';
        metaData.tdAttr = 'data-qtip="' + Ext.String.htmlEncode(record.get('errorMessages')) + '"';
        return status;
    }
    if (status === 'ERROR') {
        metaData.tdCls = 'error-status';
        return status;
    }
}
点击buttun将产生如下错误(当然其他元素从控制器调用方法没有问题所以我觉得这里的手杖是我无法掌握的范围的问题):

ext-all-rtl-debug.js?_dc=20180323101627:2585 Uncaught Error: No method named "loadMetaRequests" on Ext.button.Button
    at new Ext.Error (ext-all-rtl-debug.js?_dc=20180323101627:2585)
    at Function.raise (ext-all-rtl-debug.js?_dc=20180323101627:2644)
    at Object.Ext.raise (ext-all-rtl-debug.js?_dc=20180323101627:2723)
    at Object.callback (ext-all-rtl-debug.js?_dc=20180323101627:8481)
    at constructor.fireHandler (ext-all-rtl-debug.js?_dc=20180323101627:133044)
    at constructor.onClick (ext-all-rtl-debug.js?_dc=20180323101627:133032)
    at constructor.fire (ext-all-rtl-debug.js?_dc=20180323101627:20326)
    at constructor.fire (ext-all-rtl-debug.js?_dc=20180323101627:32699)
    at constructor.publish (ext-all-rtl-debug.js?_dc=20180323101627:32675)
    at constructor.doDelegatedEvent (ext-all-rtl-debug.js?_dc=20180323101627:32725)
Ext.Error @ ext-all-rtl-debug.js?_dc=20180323101627:2585
raise @ ext-all-rtl-debug.js?_dc=20180323101627:2644
Ext.raise @ ext-all-rtl-debug.js?_dc=20180323101627:2723
callback @ ext-all-rtl-debug.js?_dc=20180323101627:8481
fireHandler @ ext-all-rtl-debug.js?_dc=20180323101627:133044
onClick @ ext-all-rtl-debug.js?_dc=20180323101627:133032
fire @ ext-all-rtl-debug.js?_dc=20180323101627:20326
fire @ ext-all-rtl-debug.js?_dc=20180323101627:32699
publish @ ext-all-rtl-debug.js?_dc=20180323101627:32675
doDelegatedEvent @ ext-all-rtl-debug.js?_dc=20180323101627:32725
onDelegatedEvent @ ext-all-rtl-debug.js?_dc=20180323101627:32712
(anonymous) @ ext-all-rtl-debug.js?_dc=20180323101627:6696

对于如何从该控制器实际调用方法的任何帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

您的按钮位于浏览器窗口范围内,但控制器未在该范围内定义和/或加载。

如果您提供了网格(MetaRequests对象/渲染函数的父级范围),其中提到了控制器并且需要作为Ext.Defer函数的第三个参数,那么您应该得到所需的结果。< / p>

答案 1 :(得分:0)

可能的解决方法:

     var controller = this.controller;
     Ext.defer(function(){
         new Ext.Button({
             padding: 0,
             text: 'PDF',
             iconCls: 'x-fa fa-download',
             controller:controller,
             handler :function(){this.controller.loadMetaRequests();}
         }).render(document.body, id);
     },50);

有点脏但是有效