【问题标题】:Objext Oriented Programming Extjs - get/set values面向对象编程 Extjs - 获取/设置值
【发布时间】:2013-01-26 15:55:09
【问题描述】:

我一直在用extjs的

Ext.getCmp('xtypeid').getValue();
Ext.getCmp('xtypeId').setValue('');

获取值或设置值...我刚刚发现。就 OOP 而言,这是一个糟糕的编程......但我的问题是你如何获取值或设置值一堆文本框。如果有人可以向我展示一个执行此操作的示例程序,那就太好了。

【问题讨论】:

    标签: c# oop extjs get set


    【解决方案1】:

    这里需要它们,因为它发生的不仅仅是设置值。请记住,JavaScript 是一种基于原型的编程语言,因此您无法将它与您可能读过的 Java 或 C# 的 OOP 文章进行比较。

    不好的是使用getCmp(),如果可能的话,你应该避免使用ComponentQuery或封装refs。如果可能的话,如果不是严格要求,请避免自己设置id。使用组件查询,您可以查询任何自定义或公共属性。例如,ExtJS 还支持itemId,对于按钮,我使用一个名为action的自定义属性

    你不应该关心框架提供的方法,当你扩展或创建类并遵循那里的模式时这样做。

    澄清一下: Ext.getCmp() 不是坏事,它真的很快,坏的是大多数人自己设置了id,以便他们可以使用getCmp()可能导致重复的 id,这是一个问题。

    更新

    正如评论中提到的,Ext.ComponentQuery 非常强大和灵活。我不会在此视图中涵盖所有内容,仅介绍一个基本示例。

    让我们创建一个简单的环境。我们有一个名为Custom 的类,它是从Panel 扩展而来的。自定义在顶部有一个工具栏dockedItems,在底部有一个工具栏dockedItems

    Ext.define('Custom', {
        extend: 'Ext.panel.Panel',
        alias: 'widget.custom',
    
        tbar: {
            itemId: 'top-bar',
            items: [{
                text: 'foo',
                action: 'foo'
            },{
                text: 'bar', 
                action: 'bar'
            }]  
        },
        dockedItems: [{
            xtype: 'toolbar',
            itemId: 'bottom-bar',
            dock: 'bottom',
            items: [{
                text: 'foo-bottom',
                action: 'foo'
            },{
                text: 'bar-bottom', 
                action: 'bar'
            }]  
        }],
    
        initComponent: function() {
            this.callParent(arguments);
        }
    });
    

    现在我们正在从我们的新类创建实例,它是如何产生的,我们同时在屏幕上显示了两个实例。

    Ext.create('Custom', {
        title: 'Panel',
        itemId: 'first',
        height: 100,
        width: 400
    });
    Ext.create('Custom', {
        title: 'Other Panel',
        itemId: 'second',
        height: 100,
        width: 400
    });
    

    现在您想为自己订阅一个集中式类中的按钮事件,但您需要为此识别每个按钮。你可能已经看到我定义了一些属性,比如itemId(ExtJS 确实知道,也可以在一个组件上使用两个查询。See the API)和action。这些是我使用的名称,但您可以在此处使用任何名称。现在我们构建了我们独特的查询路径。我们将为第一个面板底部工具栏中的“foo”按钮执行此操作:

    首先我们知道我们正在寻找一个面板。你可能会说,嘿,我们正在寻找custom,因为那是我们的班级。但这并不重要,因为如果类是从panel 扩展的,ComponentQuery 看起来。但这是我们可以减少第一个结果集的第一个点,我们将选择扩展类的 xtype custom

    'custom'
    

    我们现在得到类 Custom 或任何扩展它的类的所有实例。现在太多了,我们需要一个。所以我们添加了一个过滤器属性。

    custom[itemId=first]
    

    现在我们有了第一个面板。让我们对工具栏和按钮做同样的事情

    custom[itemId=first] > toolbar[itemId=bottom-bar] > button[action=foo]
    

    差不多就是这样。

    JSFiddle

    【讨论】:

    • getCmp 的另一个不好的部分是您在静态值中烘焙,而通常不需要这样做。虽然它确实“有效”,但它确实限制了应用程序的可扩展性,因为它总是与您决定分配的任意 ID 相关联。正如你所提到的。 ComponentQuery 和 refs 可以处理绝大多数场景,同时还可以让应用程序无限扩展。
    • 感谢 sra 澄清分机。 getcmp 的不良做法...我仍在想办法在不使用它的情况下解决表单...这并不有趣... :)
    • @EagleFox 正如我所提到的,使用Ext.ComponentQueryRefs 做同样的事情,但另外它们为您提供了一个访问器方法,ref 并允许配置访问器的行为,这意味着只需通过查询获取、获取或创建,始终创建。有关更多信息,请参阅 API。并且不要忘记查询可以描述路径并使您的目标以这种方式独一无二。我将尝试在我的答案中添加一个关于查询的简单示例。
    • 非常感谢 Sra... 这是有道理的,我想知道为什么我对所有输入都使用 ex.getcmp ...
    【解决方案2】:

    您可以在控制器上使用 refs:

    Ext.define('App.controller.Some', {
        extend:'Ext.app.Controller',
    
        views: [
            ...
        ],
    
        stores: [
            ...
        ],
    
        models: [
            ...
        ],
    
    
        refs: [{
            ref: 'someCombobox',
            selector: 'combobox[id=you-combo-id]'
        }
    
        ...
    
    });
    

    在一些控制器功能中:

    this.getSomeCombobox().getValue();
    

    【讨论】:

    • 谢谢弗拉德...但是我看不出设置 ref 和设置 id 之间有什么区别...我认为有一种访问对象的方法
    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    相关资源
    最近更新 更多