How can I capture validation errors in a new Backbone.Model during instantiation?

后端 未结 4 1984
故里飘歌
故里飘歌 2021-02-10 06:20

It is easy to bind to the \'error\' event of an existing model, but what is the best way to determine if a new model is valid?

Car = Backbone.Model.extend({
  va         


        
4条回答
  •  無奈伤痛
    2021-02-10 06:52

    I haven't tested this, but I'm pretty sure that all events on all models in a collection will be passed to and triggered by the collection as well. So you should be able to listen to the error event on the collection:

    var cars = new Cars();
    cars.bind('error', function() {
        console.log('Model not valid!')
    })
    cars.add({'weight': -5});
    

    Edit: Nope, this works for setting properties on existing models, but not on model creation. Ugh - it looks like there's no way to listen for this without overriding some part of the Backbone code. Models don't perform validation when they're initialized:

    var car = new Car({weight: -5});
    console.log(car.get('weight')); // no error, logs -5
    

    And while collection.add() does perform validation, it fails silently.

    If you use collection.create() instead of collection.add(), you can check, since .create() will return false on failure. But this will try to create the model on the server, which might not be what you want.

    So, I think the only way to do this is to override collection._prepareModel and trigger a custom event, like this:

    Cars = Backbone.Collection.extend({
      model: Car,
      _prepareModel: function(model, options) {
          model = Backbone.Collection.prototype._prepareModel.call(this, model, options);
          if (!model) this.trigger('error:validation');
          return model;
      }
    });
    
    var cars = new Cars();
    cars.bind('error:validation', function() {
        console.log('Model not valid!')
    });
    cars.add({'weight': -5}); // logs: 'Model not valid!'
    

    Example here: http://jsfiddle.net/nrabinowitz/f44qk/1/

提交回复
热议问题