extjs4中的IDs与相对路径

extjs4中的IDs与相对路径,extjs,extjs4,Extjs,Extjs4,在ExtJS4中获取组件有两种主要方法。通过全局ID或相对路径 ID方法的好处是找到任何独立于视图中实际位置的组件。因此,当视图改变时,系统仍然工作。但是,随着系统越来越大,我需要将ID与名称空间一起使用,并实现一些机制来为组件的多个实例生成唯一的ID 当我在组件查询中使用相对导航时,我不必担心ID,只需导航,例如,从单击的按钮导航到我想要更改并执行的网格。但是,当视图更改时,查询可能不再工作,系统也会中断 因此,这两种方法似乎都不太理想 有没有更好的方法 在阅读了这里的答案后,我使用了以下方法

在ExtJS4中获取组件有两种主要方法。通过全局ID或相对路径

ID方法的好处是找到任何独立于视图中实际位置的组件。因此,当视图改变时,系统仍然工作。但是,随着系统越来越大,我需要将ID与名称空间一起使用,并实现一些机制来为组件的多个实例生成唯一的ID

当我在组件查询中使用相对导航时,我不必担心ID,只需导航,例如,从单击的按钮导航到我想要更改并执行的网格。但是,当视图更改时,查询可能不再工作,系统也会中断

因此,这两种方法似乎都不太理想

有没有更好的方法

在阅读了这里的答案后,我使用了以下方法:

在视图中,我使用一个lid本地ID来定义我的组件,该ID必须是唯一的,但不能像ID那样全局唯一

现在我可以使用如下查询:

someWindowInstances[0].query( 'button[lid=myButton]' );

...

someWindowInstances[n].query( 'button[lid=myButton]' );
这使myButton可以位于窗口中的任何位置,如果窗口视图发生更改,我仍然可以找到它。

使用Ext.getCmp或Ext.get从技术上讲速度较慢,并且存在以下缺陷:

如果您有两个id为button的按钮,将返回哪一个?总的来说,这会破坏你的计划——你提到了这一点。 您现在必须向客户端发送更多的代码,例如,对于每个组件,您都需要一个额外的id='my-unique-id'-这有点迂腐 对我来说最大的一个:Ext.get执行dom查找,Ext.getCmp查看这个 这比拥有一个被引用的对象要慢。 当我说引用对象时,我的意思是:

var grid=Ext.create('Ext.grid.Grid');
var Button =Ext.create('Ext.Button',handler:function(){
    grid.refresh();    
})
 
或者,如果网格超出范围太远,我将使用事件侦听器:

Ext.Panel.getComponent(0).on("change",function(){ // can also use "getComponent("name)
    grid.refresh},
this);
这有时确实会变得笨重,并且有它自己的缺点,因为你时不时地会有 Ext.getcomponent0.items.items[0].getComponent[1]。刷新,尽管这通常是可以避免的。

使用Ext.getCmp或Ext.get从技术上讲速度较慢,并且存在缺陷:

如果您有两个id为button的按钮,将返回哪一个?总的来说,这会破坏你的计划——你提到了这一点。 您现在必须向客户端发送更多的代码,例如,对于每个组件,您都需要一个额外的id='my-unique-id'-这有点迂腐 对我来说最大的一个:Ext.get执行dom查找,Ext.getCmp查看这个 这比拥有一个被引用的对象要慢。 当我说引用对象时,我的意思是:

var grid=Ext.create('Ext.grid.Grid');
var Button =Ext.create('Ext.Button',handler:function(){
    grid.refresh();    
})
 
或者,如果网格超出范围太远,我将使用事件侦听器:

Ext.Panel.getComponent(0).on("change",function(){ // can also use "getComponent("name)
    grid.refresh},
this);
这有时确实会变得笨重,并且有它自己的缺点,因为你时不时地会有
Ext.getcomponent0.items.items[0].getComponent[1]。刷新,尽管这通常是可以避免的。

如果相对路径指的是查询方法,那么这就是方法。不要忘记,您不仅可以通过DOM属性查询组件,还可以通过其xtype和基本上任何对象属性查询组件。像这样:

var panel = new Ext.panel.Panel({
    items: [{
        xtype: 'button',
        prop:  'foo'
    }],

    renderTo: Ext.getBody()
});

var button = panel.query('button[prop="foo"]')[0];

事实上,这是ExtJS4最强大和鲜为人知的特性之一。如果是描述性的,使用query而不是Ext.getCmp,您将获得更好的代码:易于阅读和维护。

如果相对路径指的是查询方法,那么这就是解决方法。不要忘记,您不仅可以通过DOM属性查询组件,还可以通过其xtype和基本上任何对象属性查询组件。像这样:

var panel = new Ext.panel.Panel({
    items: [{
        xtype: 'button',
        prop:  'foo'
    }],

    renderTo: Ext.getBody()
});

var button = panel.query('button[prop="foo"]')[0];

事实上,这是ExtJS4最强大和鲜为人知的特性之一。要具有描述性,使用query而不是Ext.getCmp,您将获得更好的代码:易于阅读和维护。

是的,我也尝试保留引用。但当我看到一个视图时,这就不太好用了。您的示例使用了项,但这也是一个相对的方法,如果视图发生更改,它很容易中断:\n您应该关注更改事件,并适当地处理依赖于此的函数是的,我也尝试保留引用。但当我看到一个视图时,这就不太好用了。您的示例使用项,但这也是一个相对的方法,如果视图发生更改,它很容易被破坏:\n您应该关注更改事件,并适当地处理依赖于此的函数。您的意思是,我可以使用自己的ID属性,而这不会由ExtJS检查Uniquence?这听起来很好,谢谢:是的,你可以使用任何属性作为ID。按照惯例,它是itemId,但当然你可以使用任何东西。你的意思是,我可以使用我自己的ID属性,它不会被ExtJS为uniquenes检查?这听起来不错,谢谢:是的,你可以使用任何属性作为ID。按照惯例,它是itemId,但当然你可以使用任何东西。