2013-07-29 11 views
5

Non dovrebbe una vista Marionetta chiusa delegare nuovamente gli eventi definiti (eventi, modelEvents, CollectionEvents) durante il rendering di nuovo?Rendering di una vista Marionetta chiusa

Sembra che devo chiamare manualmente delegateEvents dopo la chiusura e il re-rendering di una vista. Altrimenti la vista non funzionerà come previsto.

http://jsfiddle.net/4DCeY/

var app = new Marionette.Application(); 

app.addRegions({ 
    main: '.main' 
}); 

var MyView = Marionette.ItemView.extend({ 

    template: _.template('Hi, I\'m a view! Foo is: <%= foo %>'), 

    modelEvents: { 
     'change': 'onChange' 
    }, 

    onChange: function() { 
     alert('change!'); 
    } 
}); 


var Model = Backbone.Model.extend({}); 


app.addInitializer(function() { 
    var m = new Model({foo: 'bar'}); 
    var myView = new MyView({ 
     model: m 
    }); 

    app.main.show(myView); 
    myView.close(); 
    app.main.show(myView); 

    m.set({foo: 'baz'}); 

}); 

$(document).ready(function(){ 
    app.start(); 
}); 
+0

dovrebbe e lo fa, probabilmente stai facendo qualcosa di sbagliato nella vista, puoi incollare il codice della tua vista problematica – ekeren

+0

Guarda questo violino: http: // jsfiddle.net/4DCeY/Se tutto funziona correttamente, dovrebbe essere visualizzato il messaggio di avviso –

risposta

6

Se ho capito la tua domanda giusta, ci sono più problemi aperti GitHub su questo.

Ad esempio:

https://github.com/marionettejs/backbone.marionette/pull/654 https://github.com/marionettejs/backbone.marionette/issues/622

L'ultima volta che ho controllato, Derick (il creatore di Marionette) non aveva voglia di riutilizzare vista chiusi dovrebbero essere le regioni qualcosa dovrebbe fare.

Così si potrebbe

  1. semplicemente creare una nuova vista e mostrano che uno
  2. chiamata manualmente delegateEvents - ma c'era un problema con più binding di eventi che non riesco a ricordare in questo momento, quindi fate attenzione a tale proposito uno (non al lavoro in questo momento, quindi non può dare un'occhiata al codice, sorry)
  3. Scrivi la tua regione responsabile
  4. o aspettare e vedere se Derick si fonderà una delle tiro richieste
+0

Ok, grazie! Penso che proverò una propria implementazione. Volevo solo assicurarmi che non ci fossero altri modi per farlo con la marionetta! –

+0

BTW: ecco la discussione originale su github: https://github.com/marionettejs/backbone.marionette/issues/223 – django

0

un paio di punti:

  1. Non è necessario chiamare myView.close() Marionette Regione si prenderà cura di che, quando si mostra un'altra vista
  2. Marionette.Region non sostituirà la stessa vista con se stessa. Sarà solo saltare la procedura di ridondante se si vuole verificare questa correttamente è necessario 2 Visto
  3. Se si desidera un cambiamento nel modello di invocare il rendering è necessario in modo esplicito scriverlo

ho modificato il jsfiddle con le seguenti cose :

  1. aggiunti MYVIEW1 e myView2
  2. rimosso chiamata esplicita a myView.close
  3. aggiunto un invito a this.render() dalla funzione onChange

Ecco la jsfiddle corretto http://jsfiddle.net/4DCeY/1/:

app.addInitializer(function() { 
    var m = new Model({foo: 'bar'}); 
    var myView1 = new MyView({ 
     model: m 
    }); 
    var myView2 = new MyView({ 
     model: m 
    }); 

    app.main.show(myView1); 
    app.main.show(myView2); 

    m.set({foo: 'baz'}); 

}); 

E:

onChange: function() { 
    alert('change!'); 
    this.render(); 
} 
+0

Sì, ho capito, ma stiamo parlando di diversi scenari, penso. Nel mio esempio voglio riutilizzare la vista chiusa, non voglio sostituirla con un'altra istanza. Indipendentemente dal comportamento del layout, l'istanza della vista verrà chiusa e sottoposta a rendering. –

+0

@MalteWe - Non sono sicuro di aver capito, perché chiudi la visualizzazione? – ekeren

Problemi correlati