2013-07-29 32 views
5

重新呈現時,封閉的Marionette視圖不應該重新委託定義的事件(events,modelEvents,CollectionEvents)嗎?呈現封閉的Marionette視圖

看起來好像我必須在關閉並重新呈現視圖後手動調用delegateEvents。否則,該視圖將無法按預期工作。

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

它應該和它做的,你可能在視圖中做錯了什麼,你可以粘貼你的問題視圖的代碼 – ekeren

+0

看看這個小提琴:http:// jsfiddle。淨/ 4DCeY /如果一切都正常工作,應顯示警報消息 –

回答

6

如果我明白你的問題吧,有這個多開github上的問題。

例如:

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

我最後一次檢查,德里克(木偶的創建者)不喜歡重複使用封閉的觀點應該是地區應該做的。

所以,你可以

  1. 只需創建一個新的視圖,並顯示一個
  2. 手動調用delegateEvents - 但與我不記得現在多個事件綁定的問題,所以要小心大約一個(不是現在在上班,所以不能偷看的代碼,抱歉)
  3. 編寫自己的大區經理
  4. 或等待,看看德里克將合併拉一個請求
+0

好的,謝謝!我想我會嘗試一下自己的實現。只是想確保沒有任何其他方式與牽線木偶做到這一點! –

+0

BTW:這裏是在github原來討論:https://github.com/marionettejs/backbone.marionette/issues/223 – django

0

幾個百分點:

  1. 你並不需要調用myView.close()當你告訴另一視圖
  2. 木偶地區會照顧那
  3. Marionette.Region不會用自己替換相同的視圖。它只是將跳過冗餘過程,如果你要測試的這款正確,你需要2次
  4. 如果你想在模型中的變化來調用渲染你必須明確地寫出來

我改變了的jsfiddle與下面的東西:

  1. 加入myView1和myView2
  2. 除去顯式調用myView.close
  3. 從功能的onChange添加this.render)的呼叫(

以下是更正後的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'}); 

}); 

和:

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

是的,我明白你的意思,但我們都在談論不同的場景,我想。在我的例子中,我想重新使用已關閉的視圖,我不想用另一個實例替換它。無論佈局如何表現,視圖實例將被關閉並再次渲染。 –

+0

@MalteWe - 我不知道我明白,爲什麼你關閉了視圖? – ekeren