2014-07-18 18 views
1

我在ExtJS的4.2写在MVC模式工作的一个项目。我需要参考MyViewport中的特定项目(从类Ext.container.Viewport扩展而来)。需要从控制器内引用的项目具有类别MyPanel(从“Ext.Panel”扩展)。问题是,有几个项目与同一类,所以简单地做一个非标准ExtJs- 成分查询一样,ExtJS的裁判板组件与特定的标题

//inside myController.js 
refs: [ 
    ... 
    {ref: 'specificItem', selector: 'MyViewport_alias > myPanel_alias'}, 
    ... 
] 

不会得到我的项目的引用。这就是为什么我认为检索由这样的参考,因为使用MyPanel类的项目有一个属性标题

//inside myController.js 
refs: [ 
    ... 
    {ref: 'specificItem', 
    selector: 'MyViewport_alias > myPanel_alias > title="title of specific item"'}, 
    ... 
] 

但我coulnd't找到检索项目,通过引用任何实例使用它们的属性作为除this以外的组件查询的一部分。

有没有人遇到过这种问题?

回答

1

ExtJS中的组件查询与CSS query selectors非常相似。这么说,使用“称号”听起来像非常糟糕的做法 - "... > [title=My Component Title]":您也可以用语法类似于特定财产找到一个组成部分。

在最坏情况下,作为用户界面是非常敏感的改变的可见部分 - 易破坏你的应用程序,最好立即限制了应用程序的语言支持和可配置性。

理想情况下,您应该利用itemId属性作为更多健壮的引用组件的方式。

» fiddle


我没有注意到4.2不支持的属性选择 - 组件查询功能似乎总是画的灵感来自CSS虽然,所以很遗憾,如果它只是一个最近的发展,它看起来不像有什么办法可以用这种方法来做你想做的事情。

您必须手动获取组件和/或创建自己的引用。您可以选择xtype/alias4。2然后应用过滤结果,例如:

Ext.Array.filter(Ext.ComponentQuery.query('panel'), function(x){ 
    return !!x.title.match('Sub Panel 2'); 
}).shift(); 

(显然没有用了一个控制器的refs

» fiddle


...这但是很难看 - 更合理地使用itemId的理由。在第一个小提琴中已经有一个这样的例子。您只需要为属性分配一个字母数字字符串(不包含空格) - 这些并不严格要求是唯一的,但它通常是优选的。然后在您的选择器中,只需在字符串前面加上一个散列#即可,该字符串向引擎指示您正在寻找具有特定ID的组件。

itemId选择器肯定工作在4.2所以没有看到你的代码我只能猜测是什么问题。在您的帖子中,您使用的是>,它将查询范围缩小到仅限于直接后代。您是否确定您正在寻找的组件是myPanel_alias的子组件并且未包含在另一个容器中?

"myPanel_alias #myItemId"  <-- try this 
"myPanel_alias > #myItemId" <-- instead of this 
+0

感谢小提琴的例子,但它不工作的ExtJS的4.2。 – kiltek

+0

你可能会给itemId一个例子,因为我不能在ExtJs 5和ExtJs 4.2中都不工作吗? – kiltek

+1

@kiltek已更新 – Emissary