2011-04-25 35 views
10

Supongamos que tengo una vista que muestra un cuadro de búsqueda con un botón de enviar. Cuando hago clic en el botón de enviar, ¿cómo paso el valor del cuadro de búsqueda a otra vista?Cómo pasar datos de una vista a otra con eventos personalizados?

me trataron:
En vista 1, dentro de la presente devolución de llamada: this.trigger('abc', $('#searchBox').val())
En vista 2, en la función de inicialización: this.bind('abc', function(data){ console.log(data); })

pero eso no parece funcionar: el evento personalizado se dispara, pero Vista 2 no lo ve

Respuesta

5

Lamentablemente no se puede unir de esta manera - que tendrá que compartir una referencia a VIEW1 en view2:

var View2 = Backbone.View.extend({ 
    initialize: function() { 
     _.bindAll(this, 'foo'); 
     this.view1.bind('abc', this.foo);   
    }, 
    foo: function(data) { 
     console.log(data); 
    } 
}); 

Esto también significa que en algún momento es necesario establecer view1 en la instancia de View2 por lo que puedes unir contra eso.

Si no desea pasar las referencias alrededor, simplemente unir las dos vistas juntas en cualquier contenedor que les está llevando a cabo en (es decir, otro punto de vista o un controlador):

var view1 = new View1(); 
var view2 = new View2(); 

view1.bind('abc', view2.foo); 
+0

Gracias. Eso funciona. –

+1

¿Qué es 'abc'? ¿Es esa una función asociada a view1? –

1

sugiere emplear una PubSub framework además de backbone. MinPubSub es una opción popular. Utilizo la extensión jquery pubsub extraída de https://github.com/phiggins42/bloody-jquery-plugins.

Entonces, Vista 2 no necesita una referencia para ver 1. Para modificar el ejemplo de Andrew Hare, que haría:

var View2 = Backbone.View.extend({ 
     initialize: function() { 
      _.bindAll(this, 'foo'); 
      $.subscribe('abc', this.foo);   
     }, 
     foo: function(data) { 
      console.log(data); 
     } 
    }); 

Luego, en Vista 1:

$.publish('abc', $('#searchBox').val()); 

Por supuesto, con un sistema pubsub, es probable que desee utilizar algo mejor que "abc", tal vez en lugar de elegir "searchBox: submit" como el tema.

Cuestiones relacionadas