渲染封闭的木偶视图

时间:2013-07-29 09:32:47

标签: backbone.js marionette

在再次渲染时,闭合的Marionette视图是否不应重新委派已定义的事件(events,modelEvents,CollectionEvents)?

似乎我必须在关闭并重新渲染视图后手动调用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();
});

2 个答案:

答案 0 :(得分:6)

如果我理解你的问题,那么就会有多个开放的github问题。

例如:

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

上次我查了一下,Derick(木偶的创造者)并不觉得重复使用封闭的观点应该是地区应该做的事情。

所以你可以

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

答案 1 :(得分:0)

几点:

  1. 当你显示另一个视图
  2. 时,你不需要调用myView.close()木偶地区会照顾你
  3. Marionette.Region不会自己替换相同的视图。如果要正确测试,则需要2个视图
  4. ,它将跳过冗余过程
  5. 如果您希望更改模型以调用渲染,则必须明确地将其写入
  6. 我用以下内容改变了jsfiddle:

    1. 添加了myView1和myView2
    2. 删除了对myView.close的显式调用
    3. 从onChange函数
    4. 添加了对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();
      }