5

再次渲染时,关闭的 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();
});
4

2 回答 2

6

如果我理解你的问题是正确的,关于这个有多个开放的 github 问题。

例如:

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

上次我检查时,Derick(Marionette 的创建者)并不认为重用封闭视图应该是区域应该做的事情。

所以你可以

  1. 只需创建一个新视图并显示该视图
  2. 手动调用delegateEvents - 但是我现在不记得有多个事件绑定的问题,所以要小心那个(现在不在工作,所以不能偷看代码,抱歉)
  3. 编写自己的区域经理
  4. 或者等着看 Derick 是否会合并其中一个拉取请求
于 2013-07-29T18:25:35.187 回答
0

几点:

  1. 您不需要调用 myView.close() 当您显示另一个视图时,Marionette Region 会处理这个问题
  2. Marionette.Region 不会用自己替换相同的视图。如果您想正确测试它,它只会跳过冗余过程,您需要 2 个视图
  3. 如果你想改变模型来调用渲染,你必须明确地写它

我用以下东西改变了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();
}
于 2013-07-29T16:26:46.767 回答