ExtJS4 - 如何在selectionchange上获得父网格?

时间:2012-04-10 19:24:56

标签: extjs extjs4 extjs-mvc

我对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 个答案:

答案 0 :(得分:10)

刚刚发现你可以在Ext.selection.Model下使用属性视图和视图。

当您打开多个对象实例时,这非常有用。

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

selectionchange: function (view, selected, opts) {
 //get to grid??
 var grid = view.view.ownerCt;
}

答案 1 :(得分:3)

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

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

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

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

另一种方法是使用Ext.ComponentQuery.query(...)或在控制器中定义引用,如Arun V所提出的,它基本上只是Ext.ComponentQuery.query()的一个方便的包装器。如果您只有网格类的单个实例,但是如果您具有相同网格类的多个实例,则需要注意,这样可以正常工作。只需执行Ext.ComponentQuery.query('xtype-of-your-grid')将返回网格的所有实例,您将有很多乐趣找出用户选择了哪一个。

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

答案 2 :(得分:1)

修改

我看了一下selectionChange事件的文档:

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

视图未传递给selectionchange处理程序。处理此问题的一种简单方法是使用Ext.getCmp()或使用参考Ext.app.Controller的文档中所示:

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

答案 3 :(得分:1)

//获取网格

var grid = selectionModel.view.ownerCt.ownerCt;