2011-06-21 12 views
5

La pregunta es: La documentación es escasa, y soy algo así como novato: ¿alguien puede confirmar la forma adecuada (suponiendo que haya una) de vincular Backbone .Vista a instancias de Backbone.RelationalModel (desde backbone-relational.js) para actualizar/renderizar al dom? He intentado un puñado de enfoques diferentes, basados ​​en el enlace normal Modelo/Vista en Backbone, con poco éxito.Backbone-relational.js + Backbone.View (s)

La historia de fondo (/ + info): estoy aprendiendo las cuerdas con Backbone.js, y han tenido que recoger una gran cantidad durante la semana pasada. Si me falta algo obvio (que es muy probable, incluida la forma "correcta" de manejar mi problema a continuación), por favor llámame.

Estoy lidiando con una interfaz REST respaldada por mongodb (que no tengo control total sobre - o me gustaría volver a diseñar el comportamiento en el lado del servidor) que toma una gran ventaja de los diccionarios anidados, por lo He estado leyendo sobre cómo representar mejor eso en Backbone (sin romper el gran guardado() + cosas de sincronización del servidor que ofrece Backbone).

He visto dos opciones: backbone-relational y ligament.js.

Empecé con backbone-relational.js, y tengo RelationalModels (reemplazo de backbone-relational para el modelo estándar de Backbone) creado para los diversos diccionarios en el árbol que se devuelve por la interfaz REST. Las relaciones entre ellos están definidas, y el registro de consola de JSON de cada modelo (en sus respectivas funciones de inicialización) muestra que todos ellos están siendo llamados/cargados correctamente fuera del servidor en un comando fetch() en el nivel de recopilación general.

Así que, eso es todo genial.

Problema: Tengo vistas "escuchando" las actualizaciones de cada uno de esos modelos (y funciones enlazadas que deben representar plantillas en el dom), y nunca "disparan" (y mucho menos renderizan ...) . La vista principal se dispara en fetch(), no hay problema, carga el modelo de "nivel superior" y lo renderiza en el dom, pero las vistas que representan los modelos de "clave externa" dentro de ese modelo de "nivel superior" nunca lo hacen (aunque los datos se cargan DEFINITIVAMENTE en cada modelo, como lo demuestra el inicio de sesión de la consola en cada modelo mencionado anteriormente).

Cualquier idea sería muy, muy apreciada.

En respuesta directa a la respuesta Raynos a continuación (gracias Raynos!): Si he definido una URL base para el UpperLevelCollection con los UpperLevelModels existentes al (UpperLevelCollection url)/(UpperLevelModel id) en el servidor, ¿cómo me asigna esas LowerLevelCollections a las claves del diccionario dentro del volcado JSON para cada UpperLevelModel desde el lado del servidor? En otras palabras, ¿podría el uso de colecciones dentro de los modelos manejar adecuadamente un volcado de datos del servidor de esta manera (obviamente muy simplificado, pero se trata del problema) Y guardarlo/actualizarlo/sincronizarlo adecuadamente?

[{ 
    "some_key": "Some string", 
    "labels": ["A","List","Of","Strings"], 
    "content": [{ 
     "id": "12345" 
     "another_key": "Some string", 
     "list": ["A","list","of","strings"], 
    },{ 
     "id": "67890" 
     "another_key": "Some string", 
     "list": ["A","list","of","strings"], 
    }], 
}] 

Respuesta

2

general para los diccionarios anidados que toman el siguiente enfoque

var UpperLevelCollection = Backbone.Collection.extend({ 
    model: UpperLevelModel 
    }), 
    UpperLevelModel = Backbone.model.extend({ 
    initialize: function() { 
     this.nested = new LowerLevelCollection; 
    } 
    }), 
    LowerLevelCollection = Backbone.Collection.extend({ 
    model: LowerLevelModel 
    }), 
    LowerLevelModel = Backbone.Model.extend({}); 

Sólo nido de esas colecciones dentro de los modelos hasta el fondo.

+0

Gracias Raynos. Así es como lo planteé originalmente, pero me preocupó un poco que no funcionara bien con el servidor (y con guardar/sincronizar) si la URL del UpperLevelModel realmente devolvía el árbol completo (con LowerLevelModels enumerados dentro de un " contenido "clave"). He agregado un fragmento a mi publicación original (hay demasiados caracteres para la respuesta aquí). Gracias de nuevo por la ayuda - Estoy fuera de mi profundidad (claramente). – ltd

+0

@ltd sobrescribe '.parse' [ejemplo] (http://stackoverflow.com/questions/5931898/persisting-loading-metadata-in-a-backbone-js-collection/5932429#5932429) y anula' .toJSON' para hacer que la lectura y la escritura de datos funcionen. toJSON debe devolver el objeto (no una cadena json) que desea enviar a mongo cuando guarde. – Raynos

+0

Genial, gracias de nuevo. He trabajado los modelos como me sugirió, y todo parece estar funcionando muy bien en lo que respecta a los datos. Ahora, la última pregunta (espero): ¿cuál es la forma correcta de vincular los eventos add/refresh/etc dentro de la vista UpperLevelModel (suponiendo que eso ocurriera?) Al LowerLevelModel/Collection? En el nivel superior de vista de aplicación, puedo vincular esos eventos para representar las vistas de UpperLevelModel, pero estoy teniendo problemas cuando se trata de modelos/vistas de niños. Alternativamente, ¿debería estar renderizando UpperLevelModel (incluyendo colecciones/modelos secundarios) en una sola Vista? – ltd

1

El problema podría ser que a medida que carga datos nuevos en ParentModel, su colección secundaria AFAIK no se recupera, se borra y se reemplaza por una nueva colección (vea Backbone.HasMany.OnChange en la línea 584 en backbone-relational. js). Por lo tanto, tus propios enlaces en la colección de niños ya no están.

Esto es, en mi opinión, una debilidad con la relación troncal-relacional. Este comportamiento debe ser configurable, con una opción donde se usa un enfoque más lento de buscar y actualizar en lugar de borrar y reemplazar.

Cuestiones relacionadas