2011-12-20 11 views
6

Cuando mi "modelo de tabla" cambia, quiero actualizar el "modelo global".Hacer que el modelo Backbone.js cambie "parcialmente" en silencio?

chartModel.bind("change", updateGlobalModel); 

updateGlobalModel(){ 
    globalModel.set(obj) 
} 

Y viceversa, quiero que mi modelo de gráfico se actualice cuando se modifique globalModel.

globalModel.bind("change", updateChartModel); 

updateChartModel(){ 
    chartModel.set(obj) 
} 

Esto genera un bucle de retroalimentación al configurar globalmodelo. Podría evitar esto configurando {silent: true}.

Pero aquí viene el problema. Tengo otro modelo que depende del evento de cambio:

globalModel.bind("change", updateOtherModel); 

¿Cómo puedo alertar a este modelo del cambio pero no la anterior (para evitar el bucle de retroalimentación)?

ACTUALIZACIÓN:
Por ahora, me decidieron a generar un identificador específico para cada llamada conjunto:

set : function(attrs, options) { 
     if(!("setID" in attrs)){ 
      attrs.setID = myApp.utils.uniqueID(); //newDate.getTime(); 
     } 
     Backbone.Model.prototype.set.call(this, attrs, options); 
    }, 

De esta manera, siempre se puede generar un atributo "SETID" desde cualquier lugar en mi solicitud. Si el setID sigue siendo el mismo cuando obtengo algo del modelo, sé que podría haber riesgo de un ciclo de retroalimentación.

Respuesta

0

Mi conocimiento es limitado, por lo que tal vez no debería responder, pero trataría de pasar una referencia a chartModel cuando se crea que hace referencia al "otro" modelo que desea actualizar. Luego activa un evento en updateChartModel() y asegúrate de que tu "otro" modelo esté vinculado a ese evento.

La pregunta que tengo es: ¿silencia el objeto silencioso todos los eventos? ¿O solo modelos relacionados? Obviamente, esto no funcionaría si todos los eventos se silencian.

+0

Gracias por su sugerencia. Lo probaré si mi solución alternativa falla (actualicé mi pregunta). – dani

1

vale tarde que nunca ..

La forma más sencilla de hacer esto es mediante el uso de una bandera. Por ejemplo, al configurar algo en globalModel, también puede cambiar una propiedad en el modelo para indicar que ha cambiado algo. A continuación, puede verificar el valor de esta marca en updateChartModel. Por ejemplo:

chartModel.bind ("change", updateGlobalModel);

function updateGlobalModel() { 
    if (!flag) { 
     globalModel.set(obj); 
     flag = true; 
    } 
} 

Probablemente muy similar a lo que terminaste haciendo con tu setID. Como comentario adicional, subrayado tiene una función uniqueId integrada.

Otra cosa que puede hacer, que es mucho más limpio, es pasar una opción con sus conjuntos de llamadas.

chartModel.set(obj, { notify : false }); 

Sí, puede pasar cualquier opción que desea, usted no está limitado sólo a { silent : true }. Vea this discussion on github para más. A continuación, se comprueba la existencia de esta propiedad en el que maneje los eventos de cambio de este modo:

function updateGlobalModel(model, options){ 
    // explicitly check for false since it will otherwise be undefined and falsy 
    // you could reverse it.. but I find this simpler 
    if (options.notify !== false) { 
     globalModel.set(obj) 
    } 
} 

y en su tercera (y otros modelos), sólo puede renunciar a esta comprobación.

La última opción es, por supuesto, mirar su diseño. Si estos dos modelos están tan estrechamente relacionados que deben mantenerse sincronizados, tal vez tenga sentido fusionar su funcionalidad. Alternativamente, podría dividir la funcionalidad común. Todo esto depende en gran medida de su situación particular.

Cuestiones relacionadas