2012-08-07 30 views
5

Estoy tratando de implementar una función de búsqueda para mi sitio web. Cuando el usuario escribe un término de búsqueda foobar en un cuadro input y lo envía, se le redirige a http://mydomain.com/search?query=foobar.¿Debería Backbone.js obtener los parámetros GET de la URL?

Problema :: ¿Cómo debo tomar los parámetros GET query de la URL, y lo enviará al backend y obtener una serie de resultados de nuevo como una respuesta JSON? ¿Debería incluso hacerlo de esta manera?

Mi intento actual a continuación ni siquiera hace que se active la función search.

Router

var AppRouter = Backbone.Router.extend({ 
    routes: { 
     'search?query=:query': 'search' 
     // ... and some other routes 
    }, 

    search: function(query) { 
     this.photoList = new SearchCollection(); 
     var self = this; 
     this.photoList.fetch({ 
      data: {query: query}, 
      success: function() { 
       self.photoListView = new PhotoListView({ collection: self.photoList }); 
       self.photoListView.render(); 
      } 
     }); 
    } 

}); 

var app = new AppRouter(); 
Backbone.history.start({ 
    pushState: true, 
    root: '/' 
}); 

Respuesta

5

Ha habido varias cuestiones presentadas en contra de la espina dorsal por esta misma cuestión. Hay un plugin existente que funciona bien para esto:

https://github.com/jhudson8/backbone-query-parameters

Alternativamente, actualmente estoy utilizando parámetros de cadena de consulta en un simulacro de API que coincide con la ruta del juego Backbone. Ve algo como esto

Ruta

"/api/v2/application/:query"

consulta

application: function(query) { 
    var params = $.deparam(query.slice(1)); 
    // params.something... 
} 

cuanto a su problema real en la mano como estas redirigir a index.html para apoyar pushState?

+0

El usuario puede ir a 'domain.com',' domain.com/something', 'domain.com/search' y el router se ejecutará la función correcta para hacer que los elementos en la pagina. La interacción con enlaces/botones/pestañas en la página 'app.navigate()' a un segmento de URI diferente. ¿Responde esto a la pregunta sobre el redireccionamiento a 'index.html' para admitir' pushState'? – Nyxynyx

+0

No, no es así. Quiero saber cómo está configurando su servidor para pushState, no es automático. Específicamente necesita configurar su servidor web para que maneje los 404 de otra manera redireccionar a index.html. – tbranyen

+0

Tengo un enrutador en mi framework PHP que verifica si la ruta es válida antes de representar la página que contiene backbone.js. Si la URL no es válida, el enrutador PHP redireccionará a 404. – Nyxynyx

-1

Hay muy pocos casos en los que necesite leer la URL y extraer los parámetros GET. Creo que estás haciendo las cosas mal y aquí están mis opciones:

1) si solo tienes una página en tu aplicación (página de una sola aplicación) puedes mostrar los resultados mientras escriben en tu campo input o después de que golpean submit

2) si redirige al usuario a una página diferente, que significa que puede bootstrap data de manera que después de la página se carga backbone sólo tendrá que dar sus resultados y sólo hacer otras peticiones si cambiar su palabra de búsqueda

3) puede tener una variable javascript que se inicializa en la carga de la página directamente desde m el servidor donde trabajar con los parámetros GET es probablemente más fácil

+5

Excepto que ninguno de ellos le permite a un usuario de la aplicación compartir su estado con otra persona. – tbranyen

2

llegué a este mismo tema y contempla el uso de la columna vertebral-query-parámetros, pero que deben ser considerados por lo general un enfoque incorrecto.

La cadena de consulta url no está pensada para el front-end. Se envían al servidor y fuerzan una actualización cuando se navega de page.html a page.html? Something = something.

Debería usar fragmentos hash en su lugar. es decir, http://www.example.com/ajax.html#key1=value1&key2=value2, luego simplemente obtenga esos valores como la forma central normal y cree sus parámetros de solicitud a partir de eso.

Ver https://github.com/jashkenas/backbone/issues/891, https://developers.google.com/webmasters/ajax-crawling/docs/specification, http://tools.ietf.org/html/rfc3986#section-3.5

Cuestiones relacionadas