0

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

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

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

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

4

3 回答 3

1

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

...

我知道这是示例代码,但将对象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)
    }
});
于 2012-08-17T22:15:54.000 回答
1

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

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

干杯,奥列格

于 2012-08-17T21:35:13.200 回答
0

我看不出你的提议有什么问题。值得记住的是,除了使用扩展之外,您还可以覆盖 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;
            }
        }

    });

});
于 2012-08-19T18:21:27.453 回答