Як я можу сфотографувати помилки перевірки в новій Backbone.Model під час інсталяції?

Це легко пов'язати з появою «помилки» існуючої моделі, але яким найкращим чином визначити, чи дійсна нова модель?

Car = Backbone.Model.extend({
  validate: function(attributes) {
    if(attributes.weight == null || attributes.weight <=0) {
      return 'Weight must be a non-negative integer';
    }
    return '';
  }
});

Cars = Backbone.Collection.extend({
  model: Car
});

var cars = new Cars();
cars.add({'weight': -5}); //Invalid model. How do I capture the error from the validate function?
5

4 Відповіді

Логіка перевірки можна викликати явним шляхом, викликаючи метод validate вашої моделі. Однак це не призведе до запуску error . Ви можете викликати помилку вручну для моделі, зателефонувавши за методом trigger .

Один із способів досягнення бажаної поведінки - це вручну запустити подію у вашому методі ініціалізації:

Car = Backbone.Model.extend({
  initialize: function() {
    Backbone.Model.prototype.initialize.apply(this, arguments);
    var error = this.validate(this.attributes);
    if (error) {
      this.trigger('error', this, error);
    }
  },
  validate: function(attributes) {
    if(attributes.weight == null || attributes.weight <=0) {
      return 'Weight must be a non-negative integer';
    }
    return '';
  }
});
12
додано
Спасибі, це було саме те, що мені було потрібно. Іноді документи магістральних пакетів не чудово висвітлюють подробиці.
додано Автор PetrolMan, джерело

Я не протестував це, але я впевнений, що всі події на всіх моделях у колекції будуть передані і запущені колекцією. Таким чином, ви повинні мати змогу прослухати подію error у колекції:

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

І хоча collection.add() виконує перевірку, воно виходить без відповіді.

Якщо ви використовуєте collection.create() замість collection.add() , ви можете перевірити, оскільки .create() поверне false при відмові. Але це намагатиметься створити модель на сервері, яка може бути не те, що ви хочете.

Отже, я думаю, що єдиним способом це зробити є переопределення collection._prepareModel та запуску користувацької події, як це:

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/

1
додано

я зіткнувся з проблемою, як це

моє рішення

...

var handler = function(model, error, context) {}

try {
  cars.add({}, { error: handler })
} catch (e) { }        

...
1
додано
this.collection.fetch({
    validate: true
});
0
додано
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram