En Backbone.js, ¿por qué los cambios silenciosos desencadenan eventos de cambio eventualmente?


Cuando paso {"silent":true} mientras establezco un atributo en un modelo Backbone, ¿por qué eso no suprime el evento change:attribute? ¿Cuál es la ventaja de activar ese evento la próxima vez que se cambie un atributo?

Update

Backbone 0.9.10 cambió el comportamiento de pasar { "silent": true }. De la lista de cambios:

Pasar {silent:true} en el cambio ya no retrasará al individuo "cambio:attr" eventos, en su lugar se silencian por completo.

Examine el registro de cambios aquí

Author: Thaddeus Albers, 2012-04-05

2 answers

Esto también me ha confundido por algún tiempo.

La razón es que {silent:true} significa no "Hacer todo como normal, pero simplemente no desencadenar el evento".

De varios comentarios y respuestas de @jashkenas, lo que parece significar es "simplemente cambiar el valor del atributo (y agregarlo al hash 'changedAttributes'), pero posponer todas las demás actividades "relacionadas con el cambio" hasta más tarde".

'silent' no impide el evento change para esa/esas propiedades, simplemente pone en cola el 'anuncio' hasta que se activa el siguiente evento change.

Así que, probablemente sea mejor llamarlo algo como defer.

Información pertinente:

Https://github.com/documentcloud/backbone/pull/850

El punto de un cambio "silencioso" es que no se considera un cambio desde el punto de vista de los modelos. Más tarde, cuando el cambio realmente ocurre, obtienes la diferencia completa en una vez.

Https://github.com/documentcloud/backbone/issues/870

Porque el punto de los cambios silenciosos es que se le permite jugar con el estado interno de su modelo, temporalmente, sin hacer ningún cambio. Más tarde, cuando el atributo realmente cambia, la validación se ejecuta y se emiten eventos. No tendría sentido emitir un evento de error al hacer un cambio silencioso.

Actualización 4/7/2013

Nota: No tengo probado esto para confirmar el comportamiento, esto se basa solo en mi lectura de las notas de la versión...

A partir de Backbone 0.9.10, el comportamiento descrito anteriormente ha cambiado. En esa versión (y más reciente), silent:true suprime por completo los eventos change:attr, no solo los retrasa.

Http://backbonejs.org/#changelog

 30
Author: Edward M Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-07 22:37:12

En backbone 0.9.2 la función set ejecuta la validación antes de que se actualicen los cambios.

  // Run validation.
  if (!this._validate(attrs, options)) return false;

En caso de que se pase la opción {silent: true}, el código de validación no se ejecutará.

  if (options.silent || !this.validate) return true;

Eso significa, model.set({value: 100}, {silent: true}); es capaz de establecer un valor "inválido" en el modelo, por lo que los atributos se actualizan, pero los eventos de cambio no se activan.

Es útil, entonces desea actualizar algún campo y evitar la validación de modo completo, por lo que si el modelo aún no se ha completado, el cambio todavía se propaga a atributo. Pero por lo general también desea que la vista muestre el cambio, por lo que tiene que llamar manualmente model.change() o model.trigger('change:value', model, value).

 2
Author: Alexander Beletsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-16 13:51:57