Backbone.js чтение исходного кода

#javascript #backbone.js

#javascript #backbone.js

Вопрос:

Я читаю через Backbone.js источник и я несколько смущен этими строками (L230-238, v0.5.3)

 unset : function(attr, options) {
  if (!(attr in this.attributes)) return this;
  options || (options = {});
  var value = this.attributes[attr]; // ?: value appears to be unused (?)

  // Run validation.
  var validObj = {};
  validObj[attr] = void 0; //void 0 is equivalent to undefined
  if (!options.silent amp;amp; this.validate amp;amp; !this._performValidation(validObj, options)) return false;
  

Я сумасшедший или в последней строке выполняется проверка для объекта hash с одним неопределенным атрибутом?

Похоже, что проверка предназначена для выполнения на экземпляре объекта модели с удаленным атрибутом, который нужно отменить.

Текущий источник на github с выделенными строками

Ответ №1:

вы правы в своей оценке того, что он делает, но это предполагаемая функциональность.

когда вы вызываете unset, вы можете указать ему отменять только один атрибут за раз: model.unset("myAttr")

при сбросе вызывается проверка, чтобы убедиться, что модель будет переведена в допустимое состояние. если атрибут, для которого установлено значение undefined, приведет к тому, что модель будет недействительной, сброс завершится неудачно. если для атрибута допустимо значение undefined, атрибут удаляется из модели.

причина, по которой он передает «хеш-объект с одним неопределенным атрибутом», заключается в том, что все объекты в javascript как «хеш-объекты» — пары ключ-значение или ассоциативные массивы. не имеет значения, как вы получаете объект, это ассоциативный массив.

в строках 236-237 создается объект с одним пустым атрибутом, названным в честь снимаемого атрибута модели. это делается для того, чтобы манипуляции с объектом, переданным в метод validate, не изменили состояние самой модели.

надеюсь, это поможет объяснить ситуацию.

Комментарии:

1. Это действительно помогает, но я не вижу, как копия атрибута модели добавляется в строки 236-237. void 0 Делает больше, чем возвращает undefined ? Я вижу, что проверяемый объект есть this , и он передается _performValidation как this . Возможно, мне было бы легче понять, если бы я знал, откуда берется метод .validate(attrs) (строка 397) в _performValidation

2. упс! вы правы… это просто undefined . ошибка с моей стороны. исправлен мой ответ. validate(attrs) метод — это метод, который вы пишете в своей модели. если вы не предоставите его, он не вызывается. если вы предоставите его, он будет вызван: MyModel = Backbone.Model.extend({ validate: function(attrs){ ... } });

3. а, ладно, это имеет смысл. Итак, это зависит от MyModel.validate(attr) метода, который принимает attr — хэш объекта с неопределенным значением и проверяет, будет ли эта пара ключ / значение недействительной this ?

4. правильно — он запускает validate метод с атрибутами, которые «изменились» (в данном случае были удалены), чтобы вы могли проверить, что модель в порядке. смотрите Пример в документах documentcloud.github.com/backbone/#Model-validate

5. Хорошо, теперь это имеет смысл. Я вижу, как validate работает с unset такими проверками, как attr.key1 != invalid_value . Похоже, что некоторые проверки, например, (attr.key1 attr.key2).length != 2 будут проходить, когда они не должны — хотя, по общему признанию, это запутанный случай (если я снова чего-то не упустил).