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í
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.
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)
.
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