验证失败时,不会返回骨干关系验证错误

时间:2015-12-18 16:37:25

标签: javascript validation backbone.js backbone-relational

我将我的骨干关系库升级到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;
        }

1 个答案:

答案 0 :(得分:0)

https://github.com/jashkenas/backbone/blob/master/backbone.js#L727

签名为callback(model, error, options)options.validationErrorerror相同。例如:

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()