Pregunta

Estoy disfrutando Backbone.js más y más. Deseo tener múltiples puntos de vista para un modelo dado:

  • Una vista de lista donde cada modelo tiene una vista con su propio elemento li.
  • una vista de detalle que muestra todos los detalles de un modelo.

Mi pregunta es, yo estaba buscando una buena manera de permitir una vista a comunicarse con otro y se eligió la siguiente:

/** Allow a model to keep track of it's views. **/
Backbone.Model.prototype.addView = function (view) {
    // Ensure our model has a view array.
    if (typeof this.views === 'undefined')
    {
        this.views = [];
    }

    // Append our newest view to the array only if it is not already present.
    if (_.indexOf(this.views, view) === -1)
    {
        this.views.push(view);
    }
}

/** Allow a model to remove all of it's views.
 * 
 * @param {Object} args Any arguments will be provided to the view's method.
 */
Backbone.Model.prototype.unloadViews = function (args) {
    var n = (typeof this.views === 'undefined') ? 0 : this.views.length;
    for (var i = 0; i < n; i++)
    {
        var view = this.views[i];
        if (typeof view.unloadView === 'function')
        {
           view.unloadView(args);
        }
    }
}

/** Allow a model to re-render all of it's views.
 * 
 * @param {Object} args Any argyments will be provided to the view's method.
 */
Backbone.Model.prototype.renderViews = function (args) {
   var n = (typeof this.views === 'undefined') ? 0 : this.views.length;
   for (var i = 0; i < n; i++)
   {
        var view = this.views[i];
        if (typeof view.render === 'function')
        {
            view.render(args);
        }
   }
}

Mis preguntas

  1. Me estoy perdiendo algo a medida que aprendo Backbone.js que permitirán que haga esto nativly?
  2. ¿Hay una razón por la que debería evitar esto?

Información adicional

He compartido la aplicación (bastante rudimentaria) en GitHub: https://github.com/ aarongreenlee / aprendizaje Backbone.js . Si prefiere ver el código en ese entorno, se puede acceder desde aquí: https://github.com/aarongreenlee/Learning-backbone.js/commit/ea4e61d934d2f987726720e81c479f9d9bb86e09#diff-2 (inicial commit).

Gracias por su tiempo y ayuda!

¿Fue útil?

Solución

Bien sus puntos de vista puede tener un árbol como referencia, pero su modelo no debe saber acerca de sus puntos de vista!

Debe establecer sus puntos de vista para escuchar a los eventos de cambio de los modelos y hacerlos reaccionar en consecuencia (re hacen que sea).

esta manera se evita referencia cruzada entre las partes inferiores de su software (la que debe ser sólida como una roca, el modelo) y las partes más altas, de las vistas. MVC clásico de separación.

Así que mover sus addViews, removeViews a Backbone.View y debe ser bueno. Será la creación de un sistema de visión jerárquica, muy parecido a lo SproutCore ofertas.

Que se diviertan!

Otros consejos

Una respuesta llegó de Twitter desde Jeremy Ashkenas de la nube documento

@aarongreenlee No hay razón para evitarlo - si usted quiere tener su vista mantienen un árbol-como referencia el uno al otro, eso es ciertamente legítimo. - @ jashkenas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top