Fix 'persist' hook for updateAttributes()
This commit is contained in:
parent
4151302e9e
commit
8a20e07b3d
20
lib/dao.js
20
lib/dao.js
|
@ -2358,14 +2358,16 @@ DataAccessObject.prototype.updateAttributes = function updateAttributes(data, op
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context.data = typedData;
|
||||||
|
|
||||||
function updateAttributesCallback(err) {
|
function updateAttributesCallback(err) {
|
||||||
var context = {
|
var ctx = {
|
||||||
Model: Model,
|
Model: Model,
|
||||||
data: data,
|
data: context.data,
|
||||||
hookState: hookState,
|
hookState: hookState,
|
||||||
options: options
|
options: options
|
||||||
};
|
};
|
||||||
Model.notifyObserversOf('loaded', context, function(err) {
|
Model.notifyObserversOf('loaded', ctx, function(err) {
|
||||||
if (!err) inst.__persisted = true;
|
if (!err) inst.__persisted = true;
|
||||||
|
|
||||||
// By default, the instance passed to updateAttributes callback is NOT updated
|
// By default, the instance passed to updateAttributes callback is NOT updated
|
||||||
|
@ -2373,7 +2375,7 @@ DataAccessObject.prototype.updateAttributes = function updateAttributes(data, op
|
||||||
// backwards compatibility, we introduced a new setting updateOnLoad,
|
// backwards compatibility, we introduced a new setting updateOnLoad,
|
||||||
// which if set, will apply these changes to the model instance too.
|
// which if set, will apply these changes to the model instance too.
|
||||||
if(Model.settings.updateOnLoad) {
|
if(Model.settings.updateOnLoad) {
|
||||||
inst.setAttributes(context.data);
|
inst.setAttributes(ctx.data);
|
||||||
}
|
}
|
||||||
done.call(inst, function () {
|
done.call(inst, function () {
|
||||||
saveDone.call(inst, function () {
|
saveDone.call(inst, function () {
|
||||||
|
@ -2395,21 +2397,21 @@ DataAccessObject.prototype.updateAttributes = function updateAttributes(data, op
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
context = {
|
var ctx = {
|
||||||
Model: Model,
|
Model: Model,
|
||||||
where: byIdQuery(Model, getIdValue(Model, inst)).where,
|
where: byIdQuery(Model, getIdValue(Model, inst)).where,
|
||||||
data: data,
|
data: context.data,
|
||||||
currentInstance: inst,
|
currentInstance: inst,
|
||||||
hookState: hookState,
|
hookState: hookState,
|
||||||
options: options
|
options: options
|
||||||
};
|
};
|
||||||
Model.notifyObserversOf('persist', context, function(err) {
|
Model.notifyObserversOf('persist', ctx, function(err) {
|
||||||
if (connector.updateAttributes.length === 5) {
|
if (connector.updateAttributes.length === 5) {
|
||||||
connector.updateAttributes(model, getIdValue(inst.constructor, inst),
|
connector.updateAttributes(model, getIdValue(inst.constructor, inst),
|
||||||
inst.constructor._forDB(typedData), options, updateAttributesCallback);
|
inst.constructor._forDB(context.data), options, updateAttributesCallback);
|
||||||
} else {
|
} else {
|
||||||
connector.updateAttributes(model, getIdValue(inst.constructor, inst),
|
connector.updateAttributes(model, getIdValue(inst.constructor, inst),
|
||||||
inst.constructor._forDB(typedData), updateAttributesCallback);
|
inst.constructor._forDB(context.data), updateAttributesCallback);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, data, cb);
|
}, data, cb);
|
||||||
|
|
|
@ -1154,6 +1154,58 @@ module.exports = function(dataSource, should) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('applies updates from `persist` hook - for nested model instance', function(done) {
|
||||||
|
var Address = dataSource.createModel('Address', {
|
||||||
|
id: { type: String, id: true, default: 1 },
|
||||||
|
city: { type: String, required: true },
|
||||||
|
country: { type: String, required: true }
|
||||||
|
});
|
||||||
|
|
||||||
|
var User = dataSource.createModel('User', {
|
||||||
|
id: { type: String, id: true, default: uid() },
|
||||||
|
name: { type: String, required: true },
|
||||||
|
address: {type: Address, required: false}
|
||||||
|
});
|
||||||
|
|
||||||
|
User.create({name: 'Joe'}, function(err, instance) {
|
||||||
|
if (err) return done(err);
|
||||||
|
|
||||||
|
var existingUser = instance;
|
||||||
|
|
||||||
|
User.observe('persist', pushContextAndNext(function(ctx){
|
||||||
|
should.exist(ctx.data.address)
|
||||||
|
ctx.data.address.should.be.type('object');
|
||||||
|
ctx.data.address.should.not.be.instanceOf(Address);
|
||||||
|
|
||||||
|
ctx.data.extra = 'hook data';
|
||||||
|
}));
|
||||||
|
|
||||||
|
// By default, the instance passed to updateAttributes callback is NOT updated
|
||||||
|
// with the changes made through persist/loaded hooks. To preserve
|
||||||
|
// backwards compatibility, we introduced a new setting updateOnLoad,
|
||||||
|
// which if set, will apply these changes to the model instance too.
|
||||||
|
User.settings.updateOnLoad = true;
|
||||||
|
existingUser.updateAttributes(
|
||||||
|
{ address: new Address({city: 'Springfield', country: 'USA'}) },
|
||||||
|
function(err, inst) {
|
||||||
|
if (err) return done(err);
|
||||||
|
|
||||||
|
inst.should.have.property('extra', 'hook data');
|
||||||
|
|
||||||
|
User.findById(existingUser.id, function(err, dbInstance) {
|
||||||
|
if (err) return done(err);
|
||||||
|
dbInstance.toObject(true).should.eql({
|
||||||
|
id: existingUser.id,
|
||||||
|
name: existingUser.name,
|
||||||
|
address: {id: '1', city: 'Springfield', country: 'USA'},
|
||||||
|
extra: 'hook data'
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('triggers `loaded` hook', function(done) {
|
it('triggers `loaded` hook', function(done) {
|
||||||
TestModel.observe('loaded', pushContextAndNext());
|
TestModel.observe('loaded', pushContextAndNext());
|
||||||
existingInstance.updateAttributes({ name: 'changed' }, function(err) {
|
existingInstance.updateAttributes({ name: 'changed' }, function(err) {
|
||||||
|
|
Loading…
Reference in New Issue