2011-03-06 12 views
7

Actualmente estoy probando Backbone.js junto con una aplicación de rieles. Mi problema es que no sé cómo implementar los controladores y las vistas de Backbone con mi aplicación Rails. He leído muchos tutoriales, pero siempre están usando solo un controlador en backbone.js.Backbone.js con Rails

Por ejemplo, tengo dos controladores en los rieles.

  • actividades Controlador
    • Incluye dos puntos de vista, un mapa de Google y un campo de búsqueda. El mapa de Google se inserta con una vista de red troncal, el campo de búsqueda está en HTML y obtiene su funcionalidad a través de una vista de red troncal.
    • El campo de búsqueda debe obtener datos de mi modelo de rieles y mostrar marcadores dentro del mapa.

Y el otro es

  • Usuarios Controlador
    • Aquí el perfil de los usuarios es visto, y quiero añadir alguna funcionalidad Ajax como valores de actualización y otras cosas

En mi application.js I iniciar la aplicación utilizando

var App = { 
    Views: {}, 
    Controllers: {}, 
    Collections: {}, 
    init: function() { 
     new App.Controllers.Activities(); 
     new App.Controllers.Users(); 
     Backbone.history.start(); 
    } 
}; 

$(function() { 
    App.init(); 
}); 

El problema es, que no necesito el controlador Actividades en mi perfil de usuario y el controlador de usuarios en el controlador Rails Actividades. ¿Cómo podría resolver esto? ¿Debo intentar leer la URL actual dentro de javascript y luego decidir qué controlador se usa? ¿O debería poner el archivo JavaScript en la aplicación.html.erb y luego decidir aquí qué controlador debería usarse?

¿O es esta la manera incorrecta de usar los controladores backbone.js?

¿Me estoy equivocando con la estructura de backbone.js? ¿O estoy usando los Controladores de una manera incorrecta?

Otra pregunta es, ¿cómo agregar poco JavaScript, en particular la funcionalidad jQuery, a través de Backbone.js? Por ejemplo, quiero quitar la etiqueta dentro de un campo, cuando el usuario hace clic en el campo. O quiero hacer alguna función de tabulación y simplemente alternar la visibilidad de algunos elementos. ¿Debo crear para cada elemento que use javascript una vista Backbone? ¿O es esta sobrecarga?

Espero que haya sido claro y que cualquiera pueda ayudar, thx!

Respuesta

2

¿Por qué no hacer uso de la función de rutas Backbone proporciona para decidir qué método llamar? El controlador de actividades contendría solo el uso de rutas para actividades, el controlador de usuario solo para el manejo del usuario, y así sucesivamente. De esta manera, puede instanciar el controlador tal como lo hace y el enrutamiento decidirá qué sucede en función del hash de la ubicación actual.

Si no puede usar enlaces con valores hash (o no hay tales enlaces en su página), simplemente nombraría contenedores de mi vista lo suficientemente específicos para adjuntar eventos solo para la vista actual cuando sea necesario.

jQuery plugins etc. pertenecen a las vistas IMO.Lo mismo ocurre con las pestañas y la alternancia de sugerencias de entrada.

actualización

En un nivel general (y me no necesariamente recomendaría hacerlo de esta manera): Si tiene dos métodos:

// should be only called for the 'Foo' controller 
function foo() { 
    alert("FOO"); 
}; 

// should be only called for the 'Bar' controller 
function bar() { 
    alert("BAR"); 
}; 

y quiere llamar a uno solo de dependiendo del controlador actual de Rails, cree un pequeño ayudante:

por ej. en ti * ayudantes/application_helper.rb *

def body_class 
    controller.controller_name 
end 

continuación, llama a este método en su archivo de diseño (o el encabezado parcial):

<body class="<%= body_class %>"> 
… 

y utilizar, por ejemplo, jQuery para "dividir" la ejecución de JS:

if ($('body').hasClass('foo')) { 
    foo(); 
} else if ($('body').hasClass('bar')) { 
    bar(); 
} 
+0

¡Usar las rutas es una buena idea! Pero como dijiste, mi URL no tiene ningún truco. Estoy usando las rutas estándar de los rieles.¿Hay una manera mejor de decidir qué controlador elegir? O tal vez voy a tenedor backbone.js y agregar esta funcionalidad. ¿Qué piensas? – 23tux

+0

No creo que sea necesario un tenedor. Sus controladores son solo clases, nada debería suceder realmente a menos que llame a uno de estos métodos de clases. ¿Podría explicar qué está haciendo dentro de sus controladores que hace que quiera "dividir" el código de esta manera? (En un nivel más general: agregaré otra forma de invocar JS dependiendo del controlador actual de Rails a mi respuesta). – polarblau

+0

thx para que haga su comentario y su actualización. Pero no me gusta este método que CSS está involucrado para decidir qué controlador se debe utilizar. Quiero dividir este código de esta manera, porque creo que es más claro mantener el código JavaScript del controlador de actividades aparte de otros controladores. Por ejemplo, tengo un mapa en el controlador de actividades y en el controlador de usuarios. La vista es la misma, pero el comportamiento es diferente. Otra cosa es, ¿cómo podría manejar esto dentro del método particular de los rieles (digamos, el código solo pertenece a un método de un controlador, por ejemplo, la acción nueva)? – 23tux

1

Uso personalmente el jammit (del mismo autor de la red troncal). Puede agrupar hojas de estilo y archivos javascripts por módulo y usarlos en sus diferentes páginas. Entonces usted crea un módulo para su vista de actividades y otro para su vista de usuario, cada uno de los cuales requiere el archivo JavaScript necesario. Dos cosas buenas sobre este:

  • que han único código utilizado en la página cargada en la página
  • Jammit comprsses todo para usted

Este es el camino a seguir cuando no se cree una sola página aplicación web en la que confía en # rutas para navegar de un controlador a otro. En tu caso, tienes varias aplicaciones de una sola página dentro de una aplicación principal de rieles.

+0

Jammit podría ser una buena manera de hacer esto. Pero me pregunto si podría haber un problema de rendimiento. Debido a que comprime los archivos javascript para cada controlador en un solo archivo, crea un archivo único para cada controlador (o incluso para cada acción). Así que cada vez que accede a una nueva página, todo el Backbone.js y (en mi caso) jQuery framework se carga, porque está incluido en un único archivo. ¿Cómo podría manejar esto? ¿Mantener Backbone.js y jQuery aparte de Jammit? Pero entonces no puedo beneficiarme del hecho de que solo tengo un archivo JS y un número menor de solicitudes HTTP. ¿Qué piensas? – 23tux

+0

Tengo un archivo common.js con jQuery & backbone y un archivo js para un conjunto de vistas de carriles. Eso sería 2 solicitudes y una vez que el archivo common.js se carga (y almacena en caché), 1 solicitud. Jammit comprimirá los archivos en una carpeta de activos que usará para la implementación de producción. Sin compresión en este entorno. – Julien

+0

Tenga en cuenta que en Rails 3.1, la función de canalización de activos hace lo que Jammit hace (para JS, CSS), lo que permite una buena separación de la funcionalidad entre los archivos. Para una aplicación más pequeña, el comportamiento predeterminado es mejor: todos los JS se minian/de-comentan/etc en un único archivo, que luego se almacena en caché localmente en el navegador. Muchas aplicaciones pueden usar las opciones de manifiesto para determinar cómo se empaquetan los archivos y cuándo se envían. –

1

Im a Backbone.js newb, así que por favor alguien me corrija si estoy equivocado, pero creo que está confundiendo para qué se usan los controladores Backbone.

Los controladores Backbone.js consisten básicamente en rutas hashbang (similares a las rutas Rails) y las acciones que estas rutas llaman. Por ejemplo, si usted tiene una ruta rieles que rendir una vista http://mysite.com/backbone_test y tiene una columna vertebral siguiente ruta:

var MyController = Backbone.Controller.extend({ 
    routes: { 
    "foo/:bar":   "myFirstFunction" 
    }, 
    myFirstFunction: function(bar){ 
    console.log(bar); 
    }); 

entonces si vas a continuación http://mysite.com/backbone_test#foo/THIS-IS-AMAZING MyController.MyFirstFunction es ejecutado y "this-is-increíble" se registra en la consola JS.

A menos que tenga una necesidad directa de este tipo de funcionalidad relacionada con hashbang, como guardar un estado de su aplicación JavaScript a través de una url (por ejemplo: http://my.app.com/#key=value&key=value&ad-infinitum=true) Id desaconseja el uso de controladores Backbone. Puede obtener toda la funcionalidad que describió a través de Colecciones y Vistas de Modelos.

Lo bueno de los controladores y la red troncal en general es que sus partes modulares y diferentes se pueden utilizar de forma independiente.

Supongo que el resumen de esta respuesta es que si no tiene una sola página de la aplicación javascript, no use los Controles Backbone, confíe en sus controladores de rieles.

+0

thx para su comentario, pero creo que incluso si no tiene una aplicación de una sola página de JavaScript puede (o debería) utilizar Backbone.js cuando la parte de JavaScript se hace más grande. Quiero poder usar la forma RESTful de que Backbone.js se está comunicando con mis controladores. – 23tux

+1

No dije que no deberías usar Backbone.js. De hecho, me encanta Backbone.js porque te obliga a estructurar tu código Javascript y evitar la trampa del código spaghetti. Lo que sí dije es que no siempre es necesario utilizar el Controlador Backbone.js, especialmente si no necesita rutas etiquetadas en su aplicación. –

+0

Uh, lo siento, leí mal su respuesta. Pero llegué al punto, que no necesito los controladores y muchas otras cosas que proporciona la red troncal. Ahora estoy usando require.js para mis módulos. ¡Gracias por tu respuesta! ¡Aquí hay una gran comunidad realmente genial! – 23tux

Cuestiones relacionadas