1

新しいアイテムが追加されたときに、保存された配列を更新する最良の方法を見つけようとしています。

現在、以下のコードでソートしています (sortMissions() は AppDispatcher.register コードで呼び出されます)。 _missions 配列 (たとえば、_incomplete_missions が変更された場合でも、_missions を並べ替えます)。

//MissionStore.js
// Define initial data points
var _missions = [], _incomplete_missions = [];

// Add a mission to _missions
function addMission(mission){
    _missions.push(mission);
}

// Sort _missions as desired
function sortMissions(){
    _missions = _(_missions).chain().sortBy('name').sortBy('points').value();
}

...

var MissionStore = _.extend({}, EventEmitter.prototype, {
    ...
    // Return Mission data
    getMissions: function() {
        return _missions;
    },
    // emit change event
    emitChange: function() {
        this.emit('change');
    },

    // add change listener
    addChangeListener: function(callback) {
        this.on('change', callback);
    },

    // remove change listener
    removeChangeListener: function(callback) {
        this.removeListener('change', callback);
    }
});

AppDispatcher.register(function(payload) {
    var action = payload.action;
    var text;

    switch(action.actionType) {

        case MissionActionConstants.MISSION_SAVE:
            addMission(action.mission);
            break;
        default:
            return true;
    }

    sortMissions();
    MissionStore.emitChange();

    return true;
});

MissionStore.getMissions() で _missions をソートするだけで、他の場所ではソートしないことを考えましたが、何かが変更されたかどうかにかかわらず、getMissions() が呼び出されるたびにソートされることになります。

また、_missions が変更されるすべてのディスパッチャ ケースに sortMissions() を挿入することも考えましたが、それは自分自身を複製しているようです。

理想的には、(同じストア内から) _missions 配列の変更をサブスクライブし、_missions が変更された場合にのみ _missions を並べ替えたいのですが、どうすればよいかわかりません。

ありがとう!

4

1 に答える 1