【问题标题】:Non mapped properties - Sequelize非映射属性 - Sequelize
【发布时间】:2016-09-09 08:57:38
【问题描述】:

支持是:React、Redux 和 Sequelize。 基本上,当 Redux 存储更新时,我希望能够将对象标记为 dirty

function updateCar(carToUpdate, car) {
    switch(car[1]) {
        case "models":
            carToUpdate.models = car[3];
            carToUpdate.setDirty();
            break;
    }    
};

然后当有人点击保存按钮时,我只想更新那些将脏标志设置为 true 的模型

var state = request.body;

state.forEach(function (car) {
    if (car && car.isDirty) {
        updateCar(car);
    }
}

现在我有以下车型:

module.exports = function (sequelize, DataTypes) {
  var Cars = sequelize.define('Cars',
    {
      name: DataTypes.STRING,
      type: DataTypes.INTEGER,
      models: DataTypes.INTEGER,
      //Next is NOT working, this does not make it non-mapped
      isDirty: {
        type: DataTypes.BOOLEAN,
        scope: false
      },
    },
    {
      classMethods: {
        associate: function (models) {
          // associations can be defined here
        }
      },
      instanceMethods: {
        setDirty: function() {
          this.isDirty = true;
        }
      }
    });
  return Cars;
};

任何有非映射字段或类似经验的人?

【问题讨论】:

    标签: node.js reactjs sequelize.js redux sequelize-cli


    【解决方案1】:

    终于找到了。

    汽车的型号应包含VIRTUAL 属性:

    module.exports = function (sequelize, DataTypes) {
      var Cars = sequelize.define('Cars',
        {
          name: DataTypes.STRING,
          type: DataTypes.INTEGER,
          models: DataTypes.INTEGER,
          isDirty: {
            type: DataTypes.VIRTUAL
          },
        },
        {
          classMethods: {
            associate: function (models) {
              // associations can be defined here
            }
          }
        });
      return Cars;
    };
    

    接下来应该在更新值时设置标志:

    function updateCar(carToUpdate, car) {
        switch(car[1]) {
            case "models":
                carToUpdate.models = car[3];
                carToUpdate.isDirty = true;
                break;
        }    
    };
    

    然后save方法可以检查isDirty标志 var state = request.body;

    state.forEach(function (car) {
        if (car && car.isDirty) {
            console.log(car.name +": "+ car.isDirty);
            updateCar(car);
        }
    }, this);
    

    最后但同样重要的是,我们将 isDirty 标志重置为 false,因此我们不会一遍又一遍地更新相同的模型。

    var save = function () {
        var state = carStore.getState();
        return $.ajax({
            url: "/Cars/update",
            data: JSON.stringify(state),
            method: "POST",
            contentType: "application/json"
        }).then(function() {
            carStore.dispatch({
                type: 'resetDirty',
                data: null
            });
        });
    };
    

    以及重置标志的调度方法:

    function updateReducer(state, action) {
        switch (action.type) {
            case 'load':
                return action.data;
            case 'update':
                return updateCars(action.carChanges, state);
            case 'resetDirty':
                return resetDirtyFlags(state);
            default:
                return action.data;
        }
    
    }
    
    function resetDirtyFlags(state) {
        var newState = $.extend(true, [], state);
        if(state) {
            newState.forEach(function(car) {
                car.isDirty = false;
            }, this);
            return newState;
        }
        return newState;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      相关资源
      最近更新 更多