0

私はsenchatouchと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'
        }
    }

});

storeたとえば、senchaではモデルアイテムのリストをグリッドにバインドするためにaが使用されていることを知っています。このクラスにカスタムメソッドも追加するのは良い考えではないかと思います。

例えば。ストア内のすべてのアイテムの総数を取得するメソッドが必要だとします。OOPの観点から、このような方法をスト​​アに直接導入することは私にとって理にかなっています。

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

これらのメソッドをストアに直接配置するのは良い考えなのか、それとも何らかの理由で回避するのが良いのか、疑問に思います。

4

3 に答える 3

1

あなたのクラスを拡張してクリストフを先に進めてください、それはあなたのビジネスです、それは大丈夫です:)

私はストア/モデル/プロキシの大きな階層を作成していて、すべてが機能しています。煎茶ファンデーションクラス(SFC!)かっこいい!

乾杯、オレグ

于 2012-08-17T21:35:13.200 に答える
1

階層的アプローチに問題はありませんが、継承は一種の「奇妙な」imoになります。ビジネスロジックはモデルに関連付けられます..特定のフィールドとそうでないものは、特定の種類のモデルのみを受け入れるメソッドがストアにあります。保存するためのいくつかのマイナーな調整により、モデルにビジネスロジックメソッドを存在させることができます。それはすべて、個人的な好み、必要なモデルの数、フィールドをどのように結び付けるかなどに依存します。

..。

これがサンプルコードであることは知っていますが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 に答える
0

私はあなたの提案に何も悪いことは見ていません。次のように、extendを使用する代わりに、ExtJの基本クラスをオーバーライドすることもできることを覚えておく価値があります。

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 に答える