5

我对 ExtJS3 几乎没有经验,现在从版本 4 开始。

在我的控制器中,我有这个:

init: function ()
{
    this.control({
        "userlist":
        {
            selectionchange: function (view, selected, opts)
            {
                 //get to grid??
            }
        }
    });
}

如何在不使用 id 的情况下访问发生此事件的网格?如果选择了项目,我想启用/禁用网格工具栏 ( tbar) 上的按钮,但我不想提供任何 id(不是栏,不是单个按钮)

编辑:解决方案是使用refs控制器中的属性:

refs:
[
    {
        ref: "list",
        selector: "userlist"
    }
],


selectionchange: this.activateTbButtons

activateTbButtons: function (selected, opts)
{
    if (selected.selected.length == 1)
    {
        var tb = this.getList().query("toolbar");
    }
}
4

4 回答 4

10

刚刚发现可以使用属性视图,以及 Ext.selection.Model 下的视图。

当您假设打开对象的多个实例时,这可能很有用。

因此,要访问示例中的网格:

selectionchange: function (view, selected, opts) {
 //get to grid??
 var grid = view.view.ownerCt;
}
于 2012-11-16T14:09:57.430 回答
3

遇到同样的问题,发现以前的答案缺少一些要点。简而言之,我建议:

selectionchange: function (selModel, selected, eOpts) {
  var grid = selModel.view.ownerCt;
}

Adezj 已经提出了这一点,尽管它引用了将视图作为第一个参数的 selectionchange 事件,并且不适用于 ExtJS 4.0.7+。(不认为 selectionchange 曾经将观点作为论据吗?)

请注意,这可能不被 ExtJS 正式支持,因为 API 文档中根本没有提到选择模型的视图属性。

另一种方法是使用 Ext.ComponentQuery.query(...) 或在控制器中定义 refs,正如 Arun V 所建议的那样,这基本上只是 Ext.ComponentQuery.query() 的一个方便的包装器。如果您只有网格类的单个实例,这可以正常工作,但您需要注意以防您有同一个网格类的多个实例。只需执行 Ext.ComponentQuery.query('xtype-of-your-grid') 将返回您的网格的所有实例,并且您会发现用户在哪个实例中选择了一些东西。

因此,一般来说,我强烈建议您始终从触发事件的组件或对象开始向上工作,以确保您位于组件层次结构的正确分支中,除非您确定永远不会拥有多个您为其编写控制器的那个类。

于 2013-01-23T13:33:40.597 回答
2

编辑

我查看了 selectionChange 事件的文档:

selectionchange( Ext.selection.Model this, Ext.data.Model[] selected, Object eOpts )

视图未传递给selectionchange处理程序。处理此问题的一种简单方法是使用Ext.getCmp()或使用 refs,如 docs for 中所示Ext.app.Controller

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.app.Controller

于 2012-04-10T19:29:09.370 回答
1

//获取网格

var grid = selectionModel.view.ownerCt.ownerCt;
于 2014-06-13T00:39:22.237 回答