我将我的骨干关系库升级到0.10.0我在验证模型时遇到问题,在回调方法中,validationError属性未定义。此属性在先前版本中有一个对象。
如果我更改了库文件中的代码,它可以工作,但我想询问是否有更好的方法,或者是否有预先准备的补丁。
我有一个带验证方法的模型:
define( [
'jquery',
'underscore',
'backbone',
'backbonerelational'
], function ( $, _, Backbone, Backbonerelational ) {
'use strict';
var MyModelR = Backbone.RelationalModel.extend( {
idAttribute: "itemId",
defaults: {
_hasServerSideError: false
},
validate: function ( attrs, options ) {
var error;
if ( !attrs.name ) {
error = {
name: 'name',
message: 'Please enter a name.'
};
}
return error ? error : false;
},
url: function () {
return "/myurl";
},
sync: function ( method, model, options ) {
if ( options.action ) {
options.emulateHTTP = true;
options.validate = true;
options.wait = true;
options.url = "/myurl" + options.action;
} else if ( method.toLowerCase() === "update" ) { //default action
options = options || {};
options.url = "/myurl";
}
Backbone.sync( method, model, options );
},
parse: function ( response, options ) {
//code here
}
} );
return MyModelR;
} );
我有一个监听无效事件的视图
myView = Backbone.View.extend( {
initialize: function ( options ) {
this.listenTo( this.MyModelR , 'invalid', this.invalidHandler );
...code
},
invalidHandler: function ( model, error, options ) {
if ( options.validationError ) { //validationError has undefined value
showError(...)
}
});
如果我在第1899行调整了backbone-relational.js库文件,它可以工作,我想询问是否有更好的方法来解决这个问题,或者它是一个有效的缺陷?
if ( model && model.validationError ) {
options.validationError = model.validationError;//Added this line
this.trigger( 'invalid', this, attrs, options );
model = false;
}
答案 0 :(得分:0)
https://github.com/jashkenas/backbone/blob/master/backbone.js#L727
签名为callback(model, error, options)
,options.validationError
与error
相同。例如:
var Album = Backbone.Model.extend({
validate: function(attrs, options) {
if (attrs.artist.toLowerCase() == 'nickelback') {
return "No way you're adding that here";
}
}
});
var album = new Album({artist: 'Nickelback'});
album.on("invalid", function(model, error, options) {
alert(options.validationError);
alert(error); //////////////////////////////////////////// <- look here
});
album.save()