新しいアイテムが追加されたときに、保存された配列を更新する最良の方法を見つけようとしています。
現在、以下のコードでソートしています (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 を並べ替えたいのですが、どうすればよいかわかりません。
ありがとう!