0

現在、すべての店舗の並べ替えをオーバーライドする以下のコードがあります。私がする必要があるのは、個々の店舗の並べ替えを作成することです。それ、どうやったら出来るの?

Ext.override(Ext.data.Store, {
    // override
    createSortFunction: function (field, direction) {
        direction = direction || "ASC";
        var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1;
        var sortType = this.fields.get(field).sortType;

        //create a comparison function. Takes 2 records, returns 1 if record 1 is greater,
        //-1 if record 2 is greater or 0 if they are equal
        return function (r1, r2) {

            var v1;
            var v2;

            if (field == 'Registered') {
                v1 = sortType(r1.data['AircraftNeedsRegistered']);
                v2 = sortType(r2.data['AircraftNeedsRegistered']);

                if (r1.data['AircraftNeedsRegistered'])
                    r1.data['Register'] = !r1.data['Register'];

                if (r2.data['AircraftNeedsRegistered'])
                    r2.data['Register'] = !r2.data['Register'];

                //store.getAt(rowIndex).data['Registered'] = true;
            }
            else {
                v1 = sortType(r1.data[field]);
                v2 = sortType(r2.data[field]);
            }

            // To perform case insensitive sort
            if (v1.toLowerCase) {
                v1 = v1.toLowerCase();
                v2 = v2.toLowerCase();
            }

            return directionModifier * (v1 > v2 ? 1 : (v1 < v2 ? -1 : 0));
        };
    }

私が実装したいのは次のようなものです:

function AircraftStore() {
return new Ext.data.JsonStore(Ext.apply({
    url: AVRMS.ROOT_CONTEXT + "/ssl/json/general/GetAircraftByOwnerId.aspx",
    idProperty: 'OwnerOid',
    baseParams: { OwnerOid: 0 },
    fields: ['AircraftOid', 'NNumber', 'Make', 'Model', 'Seats', 'RegistrationType', 'Airworthy', 'IsFaaAirport', 'AirworthyString', 'IsFaaAirportString', 'Airport', 'AircraftNeedsRegistered', 'Register'],
    sort: function (field, direction) {
        return customSort(field, direction);
    }
}));
    };

function customSort(field,direction) {
    //What do I put here?
}
4

1 に答える 1

1

コードの目的を正しく理解しているかどうかはわかりませんが、次のコードを使用して同じ効果が得られると思います (申し訳ありませんが、テストしていませんが、動作するはずです)。

AircraftStore = Ext.extend(Ext.data.JsonStore, {
    url: AVRMS.ROOT_CONTEXT + "/ssl/json/general/GetAircraftByOwnerId.aspx",
    idProperty: 'OwnerOid',
    baseParams: { 
        OwnerOid: 0 
    },
    fields: ['AircraftOid', 'NNumber', 'Make', 'Model', 'Seats', 'RegistrationType', 'Airworthy', 'IsFaaAirport', 'AirworthyString', 'IsFaaAirportString', 'Airport', 'AircraftNeedsRegistered', 'Register'],
    sort: function (field, direction) {
        if (field == 'Registered') {
            field = 'AircraftNeedsRegistered';
            this.query('AircraftNeedsRegistered', true).each(function(record) {
                record.data['Register'] = !record.data['Register'];
            });         
        }
        return AircraftStore.superclass.sort.call(this, field, direction);
    }
});

何かを見逃したためにこれで目的の動作が得られない場合は、 のcreateSortFunction代わりに をオーバーライドできますsort。ただし、createSortFunctionは非公開のはずなので、オーバーライドしてカスタム ロジックを処理する方が適切sortです。とにかく、最初のアプローチにとどまりたい場合は、AircraftStore は次のようになります。

AircraftStore = Ext.extend(Ext.data.JsonStore, {
    url: AVRMS.ROOT_CONTEXT + "/ssl/json/general/GetAircraftByOwnerId.aspx",
    idProperty: 'OwnerOid',
    baseParams: { 
        OwnerOid: 0 
    },
    fields: ['AircraftOid', 'NNumber', 'Make', 'Model', 'Seats', 'RegistrationType', 'Airworthy', 'IsFaaAirport', 'AirworthyString', 'IsFaaAirportString', 'Airport', 'AircraftNeedsRegistered', 'Register'],
    createSortFunction: function (field, direction) {
        // copy your createSortFunction here
    };
});
于 2012-09-29T09:06:34.770 に答える