underscore template que backbonejs javascript model-view-controller backbone.js

javascript - template - Backbone.js-¿Dónde definir view helpers?



underscore js que es (3)

A medida que construyas aplicaciones Backbone más grandes, probablemente quieras ponerle nombre a todo. Entonces tendrás un lugar para ayudantes globales. No he hecho la configuración perfecta del espacio de nombres todavía. Pero ahora estoy haciendo algo como esto:

brainswap:{ appView: {}, <== Reference to instantiated AppView class. classes = { <== Namespace for all custom Backbone classes. views : {}, models : {}, collections: {}, controllers : {}, Router: null }, models: {}, <== Instantiated models. controllers: {}, <== Instantiated controllers. router: {}, <== Instantiated routers. helpers: {}, <== Reusable helper platform methods. currentView: {}, <== A reference to the current view so that we can destroy it. init: function(){} <== Bootstrap code to start app. }

Mis clases de vista se ven algo como esto:

brainswap.classes.views.profile.contact = brainswap.classes.views.profile.base.extend({...

Mi controlador es el objeto que currentView una instancia de las nuevas vistas (y coloca una referencia en currentView . Recuerde que siempre debe eliminar su última vista para que los eventos de las vistas anteriores se separen y reduzca el uso de la memoria.

He estado pateando los neumáticos de Backbone.js y teniendo un juego en las últimas semanas, así que un poco de una pregunta de novato ...

¿Cuál es la forma "correcta" de definir y usar los ayudantes de visualización en backbone.js?

Por lo que puedo decir, el único lugar real para definir ayudantes para usar en sus plantillas está en el modelo o colección en sí. Sin embargo, cuando ese ayudante devuelve directamente HTML, esto comienza a sentirse un poco sucio.

¿Hay una mejor manera?


Hay algunos lugares diferentes que puse view helpers con Backbone.js:

Si el helper es específico para una determinada vista, póngalo en la definición de la vista:

var MyView = Backbone.View.extend({ tagName: ''div'', events: { ... }, initialize: function() { ... }, helperOne: function() { // Helper code }, anotherHelper: function() { // Helper code }, render: function() { ... this.helperOne() ... } });

Si todas las vistas usarán el asistente, amplíe la clase Backbone View para que todas las vistas hereden esta función:

_.extend(Backbone.View.prototype, { helper: function() { // Helper code } }

Si necesita compartir más complicado de ayudantes entre vistas, haga que las vistas se extiendan entre sí:

var MyOtherView = MyView.extend({ // ... render: function() { ... this.helperOne() ... } });

No estoy seguro de cuál es la mejor práctica (o si existe una mejor práctica establecida), pero estos patrones parecen bastante limpios y funcionan bien.


Solución rápida (CoffeeScript)

Backbone.View::handlebarsTemplate = (templateName) -> Handlebars.compile $(templateName).html()

Entonces puedes usar eso en tu vista:

Yourcoolapp.Views.ThingsIndex extends Backbone.view initialize: -> @template = this.handlebarsTemplate("#hb_template") # etc... someMethod: => @template = this.handlebarsTemplate("#hb_other")