【问题标题】:Should I add custom methods to Ext.data.store derived classes我应该向 Ext.data.store 派生类添加自定义方法吗
【发布时间】:2012-08-14 08:17:08
【问题描述】:

我对 sencha touch 和 extjs 完全陌生。这是场景:

假设您有这家商店,其中包含购物车中的商品:

Ext.define('MyApp.store.CardItems', {
    extend: 'Ext.data.Store',
    requires: ['MyApp.model.CardItem','Ext.data.proxy.SessionStorage'],

    config :{
        model: 'MyApp.model.QuoteItem',
        autoLoad: true,
        autoSync: true,
        identifer: 'uuid',
        proxy:{
            type:'sessionstorage',
            id:'card'
        }
    }

});

我知道在 sencha 中,store 用于将模型项列表绑定到例如网格。我只是想知道在这个类中添加自定义方法是否是个好主意。

例如。假设我们需要一种方法来获取商店中所有商品的总数。从 OOP 的角度来看,直接在商店中引入这种方法对我来说是有意义的:

getOverallQuantity:function () {
    var sum = 0;
    this.each(function (item) {
        sum += parseInt(item.get('amount'));
    }, this);
    return sum;
}

我只是想知道直接在商店中使用这些方法是否是个好主意,还是出于某种原因避免这样做?

【问题讨论】:

  • 你心中有什么让你认为应该避免的事情吗?
  • 并非如此。我只是找不到人们实际上这样做的例子。所以我想知道:-)

标签: sencha-touch extjs4 extjs sencha-touch-2


【解决方案1】:

继续 Christoph 扩展你的课程,这是你的事,没关系 :)

我正在创建大型商店/模型/代理层次结构,并且一切正常。 Sencha Foundation Classes (SFC!) 很酷!

干杯,奥列格

【讨论】:

    【解决方案2】:

    我认为分层方法没有任何问题,但继承会有点“奇怪”。业务逻辑将绑定到模型.. 某些字段,但方法将在商店中,这将只接受某些类型的模型。通过对存储进行一些小的调整,您可以让您的业务逻辑方法存在于模型中。这完全取决于个人喜好、所需模型的数量、字段如何绑定在一起等。

    ...

    我知道这是示例代码,但将 config 之类的对象放在原型上是不好的做法,并且可能导致共享实例错误。您的示例可能会暴露代理共享问题。

    var newCards = new MyApp.store.CardItems(),
    oldCards =  new MyApp.store.CardItems();
    
    newCards.load({params: {status: 'new'}});
    oldCards.load({params: {status: 'old'}});
    

    首先加载的存储将覆盖数据,因为代理是共享的。可以通过执行以下操作来避免这种情况:

        Ext.define('MyApp.store.CardItems', {
        extend: 'Ext.data.Store',
        requires: ['MyApp.model.CardItem', 'Ext.data.proxy.SessionStorage'],
        constructor: function() {
            Ext.apply(this, {
                model: 'MyApp.model.QuoteItem',
                autoLoad: true,
                autoSync: true,
                identifer: 'uuid',
                proxy: {
                    type: 'sessionstorage',
                    id: 'card'
                }
            });
    
            this.callParent(arguments)
        }
    });
    

    【讨论】:

    • 您在谈论与问题 imo 无关的其他事情。您的代码可能有效(不是亲自检查),但根据我的口味,我会创建 MyApp.store.OldCardItems 和 MyApp.store.NewCardItems 商店,它们应该有效。
    • @olegtaranenko 我只是在创建一个人为的例子来展示将对象放在原型上的危险。 ... 是为了表明该评论不是我对该问题的回答的一部分,只是对开始 Ext 编码器的有用提示。
    【解决方案3】:

    我认为您的提议没有任何问题。值得记住的是,除了使用扩展之外,您还可以覆盖 ExtJs 的基类,如下所示:

    Ext.onReady(function(){
    
        Ext.override(Ext.panel.Panel, {
            // Add functionality to a panel to determine
            // if it's the active tab within a tab panel or not 
            isActiveTab: function()
            {
                var owningTabPanel = this.up('tabpanel');
                if ( owningTabPanel )
                {
                    return owningTabPanel.getActiveTab() == this;
                } else {
                    return false;
                }
            }
    
        });
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-21
      • 2014-08-30
      • 1970-01-01
      • 2021-11-27
      • 2010-09-08
      • 2021-09-09
      • 1970-01-01
      • 2012-04-14
      相关资源
      最近更新 更多