Backbone: проверки выполняются только для параметров set () - PullRequest
2 голосов
/ 06 января 2012

У меня есть проблема, когда при запуске model.set ({field: 'value'}) проверки этой модели будут выполняться так, как если бы явно заданное поле было единственным параметром, заданным для модели.

Что я имею в виду, если у меня есть проверка, требующая наличия полей 'first_field' и 'second_field', запуск model.set ({third_field: 'value'}) не пройдет проверку, даже если first_field и second_field имеют уже был установлен. Из консоли first_field и second_field доступны как до, так и после запуска проверки ... но console.log имеет поле (attrs), заполненное только третьим полем внутри функции проверки.

Из того, что я прочитал в официальной документации, мой шаблон для метода проверки в порядке ... но что-то явно не так. Любые идеи приветствуются, код ниже:

class MyModel extends Backbone.Model
  # ...
  validate: (attrs) ->
    errors = []
    valid = true
    console.log attrs
    if (!attrs.first_field)
      errors.push('You must add a first field')
    if (errors.length > 0)
      return errors
  # ...

И из консоли, если я запустил

m = window.router.my_models.test_model  # Contains attributes 'first_field' and 'second_field'
m.set({new_field: 'test value'})

Он вернет «ложь», которая приходит из проверки. Файл console.log для attrs внутри метода validate подтверждает, что единственное имеющееся значение attrs - это набор Explicity 'new_field'

Ответы [ 2 ]

4 голосов
/ 06 января 2012

Из магистральных документов :

[Метод валидации] передаются атрибуты, которые должны быть обновленный

, поэтому объект attrs правильно содержит только new_field. Если вы хотите получить доступ к другим полям модели, вы, вероятно, можете сделать this.get("first_field");

2 голосов
/ 06 января 2012

Только атрибуты, которые изменяются, передаются методу validate, который в вашем примере new_field

Это легко исправить, чтобы обновить ваш метод проверки, чтобы увидеть, присутствует ли first_field.

Вместо

if (!attrs.first_field)
  errors.push('You must add a first field')

замените его на

if (!this.get('first_field'))
  errors.push('You must add a first field')
...