tutorial traductor react network meaning backbone javascript backbone.js coffeescript marionette

javascript - traductor - Filtrado dinámico por nodo primario en JSON anidado(BackboneJS)



backbone vs react (1)

Sé que el título de la pregunta es un poco confuso, así que, por favor, discúlpeme. Espero poder explicar mi problema.

Tengo una estructura de datos así:

{ "_data": { "Test Alignment Form": [ { "review_form": "Test Alignment Form", "rvee_uid": "52", "firstName": "Joe", "lastName": "Bloggs", "status": "NOT_STARTED", "status_clean": "Not started" }, { "review_form": "Test Alignment Form", "rvee_uid": "54", "firstName": "Steve", "lastName": "Stevenson", "status": "NOT_STARTED", "status_clean": "Not started" }, { "review_form": "Test Alignment Form", "rvee_uid": "13", "firstName": "Anne", "lastName": "Boleyn", "status": "COMPLETED", "status_clean": "Completed" } ], "Another Form": [ { "review_form": "Another Form", "rvee_uid": "10", "firstName": "Luther", "lastName": "Vandross", "status": "NEVER_TOO_MUCH", "status_clean": "Never too much, never too much... duh duh duh" }, { "review_form": "Another Form", "rvee_uid": "54", "firstName": "Steve", "lastName": "Stevenson", "status": "NOT_STARTED", "status_clean": "Not started" }, { "review_form": "Another Form", "rvee_uid": "13", "firstName": "Anne", "lastName": "Boleyn", "status": "COMPLETED", "status_clean": "Completed" } ] }, "_meta": { "generated": 1397642209, "length": 62, "duration": 3, "author": 0 } }

Y mi código es actualmente así:

window.app = app = window.app or models: {} collections: {} views: {} routes: {} init: () -> console.log ''Initialised app.'' app._app = new app.views.table() #-----------------------------------------------------------------------------# app.models.form = Backbone.RelationalModel.extend defaults: firstName: "" lastName: "" review_form: "" rvee_uid: "0" status: "" status_clean: "UNKNOWN" initialize: () -> console.log "Initialised model ''form''." app.collections.mainCollection = Backbone.Collection.extend model: app.models.form url: "data/data.json" initialize: (models, options) -> console.log "Initialised collection ''mainCollection''." @options = options @fetch reset: true @on "reset", () -> console.log "Collection reset!" app.views.tableItem = Backbone.View.extend tagName: ''li'' template: _.template $(''#row'').html() initialize: () -> console.log "Initialised view ''tableItem''." render: () -> console.log "Rendered view ''tableItem''." @$el.html @template @model.toJSON() @ app.views.table = Backbone.View.extend el: ''#table'' initialize: (data) -> console.log "Initialised view ''table''." @collection = new app.collections.mainCollection data @listenTo @collection, ''reset'', () -> @render() render: () -> console.log "Rendered view ''table''." @$el.empty() console.log @collection.models _.each @collection.models, (_item) => @renderItem(_item) renderItem: (_item) -> item = new app.views.tableItem model: _item @$el.append item.render().el #-----------------------------------------------------------------------------# app.init()

(Tenga en cuenta que tengo una versión más grande que funciona, pero con una estructura no anidada, así que esto es solo para sandboxing).

De todos modos, imagina que tengo otra vista que contiene una entrada desplegable de select , rellenada por "Formulario de alineación de prueba" y "Otro formulario". Cuando selecciono uno, quiero que los modelos vuelvan a ser hijos de esa forma. Entonces, el equivalente a analizar @[''_data''][''Test Alignment Form''] . También quiero poder acceder al objeto "_meta", ya que me gustaría poder imprimir la fecha generada en otra vista, por ejemplo. ¿Alguien sabe de las mejores prácticas para lograr esto? ¡Me he estado tirando de los pelos!

Gracias :)


Entonces ... hmm tienes una colección de colecciones para uno. Sus datos son una colección que contiene formularios. Los formularios son una colección de entradas.

su colección de formularios debe incluir su estructura de datos.

entonces debería hacer modelos de forma. esos modelos de formulario tienen colecciones de entrada.

FormCollection parse: (res) -> {@_meta} = res _.map res._data, (data, formName) => {formName, data} # we have 2 attributes on the form model FormModel initialize: -> @on ''reset'', -> # Since each form also has a collection of entries, we create a collection @entries ?= new EntryCollection @entries.parent = this # this circular dependency will create memory leaks @entries.reset @get(''data''), parse: true #remember data is an array EntryCollection parse: (res) -> @meta = parent.collection._meta res EntryModel

los modelos dentro de EntryCollection pueden acceder a @collection.meta

Debe tener en cuenta que este tipo de anidamiento es propenso a pérdidas de memoria, por lo que si su página permanece abierta durante días, debe considerar delete @parent , etc., pero es posible que no tenga que preocuparse por ello.

Esta es solo una primera oportunidad, probablemente podría hacer mejoras, pero si va a construir esto más, quiere tener un modelo para cada objeto y una colección para cada matriz. tu _data es en realidad una matriz.

tienes

"_data": { "Test Alignment Form": [ { "review_form": "Test Alignment Form", "rvee_uid": "52", "firstName": "Joe", "lastName": "Bloggs", "status": "NOT_STARTED", "status_clean": "Not started" }, { "review_form": "Test Alignment Form", "rvee_uid": "54", "firstName": "Steve", "lastName": "Stevenson", "status": "NOT_STARTED", "status_clean": "Not started" }, { "review_form": "Test Alignment Form", "rvee_uid": "13", "firstName": "Anne", "lastName": "Boleyn", "status": "COMPLETED", "status_clean": "Completed" } ], "Another Form": [ { "review_form": "Another Form", "rvee_uid": "10", "firstName": "Luther", "lastName": "Vandross", "status": "NEVER_TOO_MUCH", "status_clean": "Never too much, never too much... duh duh duh" }, { "review_form": "Another Form", "rvee_uid": "54", "firstName": "Steve", "lastName": "Stevenson", "status": "NOT_STARTED", "status_clean": "Not started" }, { "review_form": "Another Form", "rvee_uid": "13", "firstName": "Anne", "lastName": "Boleyn", "status": "COMPLETED", "status_clean": "Completed" } ] },

debería ser

"_data": [ { name: "Test Alignment Form", contents: [ { "review_form": "Test Alignment Form", "rvee_uid": "52", "firstName": "Joe", "lastName": "Bloggs", "status": "NOT_STARTED", "status_clean": "Not started" }, { "review_form": "Test Alignment Form", "rvee_uid": "54", "firstName": "Steve", "lastName": "Stevenson", "status": "NOT_STARTED", "status_clean": "Not started" }, { "review_form": "Test Alignment Form", "rvee_uid": "13", "firstName": "Anne", "lastName": "Boleyn", "status": "COMPLETED", "status_clean": "Completed" } ], }, { name: "Another Form", contents: [ { "review_form": "Another Form", "rvee_uid": "10", "firstName": "Luther", "lastName": "Vandross", "status": "NEVER_TOO_MUCH", "status_clean": "Never too much, never too much... duh duh duh" }, { "review_form": "Another Form", "rvee_uid": "54", "firstName": "Steve", "lastName": "Stevenson", "status": "NOT_STARTED", "status_clean": "Not started" }, { "review_form": "Another Form", "rvee_uid": "13", "firstName": "Anne", "lastName": "Boleyn", "status": "COMPLETED", "status_clean": "Completed" } ], }, ];

a menos que sea un malentendido, pero creo que Another Form es generada por el usuario ... podría haber formas infinitas ¿no?

Con respecto a su seguimiento

FormView render: -> @$el.empty().append formTemplate(this) @model.entries.each (model) => # if you need more speed or re-render often, you can cache these views later entryView = new EntryView {model} # assumes you have an entries-container in your form template @$(''.entries-container'').append entryView.render().el