我试图找出在添加新项目时更新存储数组的最佳方法。
现在我正在使用下面的代码对其进行排序(在 AppDispatcher.register 代码中调用 sortMissions()),但感觉效率低下,因为每次调用我的一个 switch 案例时数组都会被排序,即使它与_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 更改时对其进行排序,但我不确定我将如何做到这一点。
谢谢!