#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 с одним неопределенным атрибутом?
Похоже, что проверка предназначена для выполнения на экземпляре объекта модели с удаленным атрибутом, который нужно отменить.
Ответ №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-validate5. Хорошо, теперь это имеет смысл. Я вижу, как validate работает с
unset
такими проверками, какattr.key1 != invalid_value
. Похоже, что некоторые проверки, например,(attr.key1 attr.key2).length != 2
будут проходить, когда они не должны — хотя, по общему признанию, это запутанный случай (если я снова чего-то не упустил).