Sencha touch 我应该向Ext.data.store派生类添加自定义方法吗

Sencha touch 我应该向Ext.data.store派生类添加自定义方法吗,sencha-touch,extjs4,extjs,sencha-touch-2,Sencha Touch,Extjs4,Extjs,Sencha Touch 2,我对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',

我对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
用于将模型项列表绑定到一个网格。我只是想知道向这个类添加自定义方法是否是个好主意

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

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

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

继续吧,Christoph,扩展你的类,这是你的事,没问题:)

我正在创建商店/模型/代理的大层次结构,一切都正常。森查基础课(SFC!)很酷!
干杯,Oleg

我不认为分层方法有什么错,但继承在我看来有点“怪异”。业务逻辑将与模型相关联。。某些字段以及除方法之外的其他内容将位于存储区中,存储区将只接受某些类型的模型。通过一些小的调整来存储,您可以在模型上存在您的业务逻辑方法。这完全取决于个人偏好、所需型号的数量、各领域的联系方式等

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

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)
    }
});

我看你的建议没有任何问题。值得记住的是,除了使用extend,您还可以覆盖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;
            }
        }

    });

});

你脑子里有什么东西会让你觉得应该避免的吗?不是真的。我只是找不到人们真的这么做的例子。所以我想知道:-)您正在谈论与imo问题无关的其他事情。您的代码可能是工作代码(不是个人检查)但根据我的喜好,我会创建MyApp.store.OldCardItems&MyApp.store.NewCardItems商店,它们应该可以工作。@olegtaranenko我只是创建了一个人为的例子,说明在原型上放置对象的危险性。这个这是为了表明这个评论并不是我对这个问题的回答的一部分,只是一个对初学者有用的提示。