我正在尝试找出在添加新项目时更新存储阵列的最佳方法。
现在我正在使用下面的代码对其进行排序(在AppDispatcher.register代码中调用sortMissions()),但感觉效率低下,因为每次调用一个switch case时都会对数组进行排序,即使它与_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()时都会对它进行排序,无论是否有任何改变。
我还考虑过在每个调度程序中添加sortMissions(),其中_missions会改变,但这似乎是我在重复自己。
理想情况下,我只想订阅_missions数组(来自同一商店内)的更改,并仅在更改时对_ _ _进行排序,但我不确定如何做到这一点。
谢谢!
答案 0 :(得分:2)
也许你应该在控制器视图中进行排序,而不是在商店中进行排序。
这样,您只维护一个任务集合,这可能是不可变数据。我推荐ImmutableJS。
然后,如果MissionsStore.getMissions() !== this.state.missions
,您进行排序,然后将已排序的集合传递给this.setState()
。
否则,我认为您正在考虑为每种类型的维护保留一个单独的缓存集合,这似乎需要维护很多。但它确实是一种可行的选择。