1

我试图找出在添加新项目时更新存储数组的最佳方法。

现在我正在使用下面的代码对其进行排序(在 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 更改时对其进行排序,但我不确定我将如何做到这一点。

谢谢!

4

1 回答 1

2

也许您应该在控制器视图中进行排序,而不是在商店中。

这样,您只维护一个任务集合,这可能是不可变的数据。我为此推荐ImmutableJS

然后,如果MissionsStore.getMissions() !== this.state.missions,您进行排序,然后将排序后的集合传递给this.setState()

否则,我认为您正在考虑为每种类型的排序维护一个单独的缓存集合,这似乎需要维护很多。但这肯定是一个可行的选择。

于 2015-03-27T21:41:53.080 回答