2013-07-29 12 views
5

Czy zamknięty widok marionetki nie powinien ponownie delegować zdefiniowanych zdarzeń (zdarzeń, modelEvents, CollectionEvent) podczas ponownego renderowania?Renderowanie zamkniętego widoku marionetki

Wygląda na to, że muszę ręcznie wywoływać delegateEvents po zamknięciu i ponownym renderowaniu widoku. W przeciwnym razie widok nie będzie działał zgodnie z oczekiwaniami.

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

Powinno i tak jest, prawdopodobnie robisz coś złego w widoku, możesz wkleić kod swojego problematycznego widoku – ekeren

+0

Spójrz na to skrzypce: http: // jsfiddle.net/4DCeY/Jeśli wszystko będzie działać poprawnie, komunikat ostrzegawczy powinien zostać wyświetlony –

Odpowiedz

6

Jeśli rozumiem pytanie rację, istnieje wiele kwestii otwartych GitHub na ten temat.

Na przykład:

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

Ostatni raz sprawdzone, Derick (twórca Marionette) nie miała ochoty ponowne zamknięte widoki powinny być regiony coś należy zrobić.

Więc można

  1. po prostu utworzyć nowy widok i pokazać, że jeden
  2. ręcznie wywołać delegateEvents - ale nie było problemu z wieloma powiązaniami zdarzeń, które nie pamiętam w tej chwili, więc należy być ostrożnym o tym, że jeden (nie teraz w pracy, więc nie można rzucić okiem na kod, przepraszam)
  3. napisać własny menedżer regionu
  4. lub poczekać i zobaczyć, czy Derick połączą jeden pull żąda
+0

Okay, dziękuję! Myślę, że spróbuję własnej implementacji. Chciałem tylko upewnić się, że nie ma na to innych sposobów z marionetką! –

+0

BTW: oto oryginalna dyskusja na temat github: https://github.com/marionettejs/backbone.marionette/issues/223 – django

0

kilka punktów:

  1. Nie trzeba zadzwonić myView.close() Marionette Region zadba o to, kiedy pokażesz inny widok
  2. Marionette.Region nie zastąpi tego samego widoku samym sobą. Będzie to po prostu pominąć zbędne procedury, jeśli chcesz przetestować to poprawnie trzeba 2 widoki
  3. Jeśli chcesz zmiany w modelu powołać renderowanie należy wyraźnie napisać, że

I zmienił jsfiddle z następujących rzeczy :

  1. dodano myView1 i myView2
  2. usunięto bezpośredniego wywołania myView.close
  3. dodano wezwanie this.render() z funkcji onChange

Oto poprawiony jsfiddle 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'}); 

}); 

I:

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

Tak, rozumiem, ale mówimy o różnych scenariuszach, jak sądzę. W moim przykładzie chcę ponownie użyć zamkniętego widoku, nie chcę go zastępować inną instancją. Nie ważne jak zachowuje się układ, instancja widoku zostanie zamknięta i ponownie wyświetlona. –

+0

@MalteWe - Nie jestem pewien, czy rozumiem, dlaczego zamykasz widok? – ekeren

Powiązane problemy