骨干木偶区域显示不渲染

Backbone Marionette Region show without render

本文关键字:显示 区域      更新时间:2023-09-26
是否可以

将已经渲染的视图放入主干木偶区域而不再次渲染?

例如:

region.show(myView); // This will call render on myView

我不希望该地区再次呈现我的视图。

如果我这样做:

region.attachView(myView); // This won't render myView, but it also won't show it

首先覆盖木偶 ItemView 构造函数并像这样渲染(如果你想在 CollectionView 和 CompositeView 中使用它,也会覆盖它们的这些方法):

var fnCons = Marionette.ItemView.prototype.constructor,
    fnRender = Marionette.ItemView.prototype.render;
Marionette.ItemView.prototype.constructor = function(){
  this.firstRender = true;
  fnCons.apply(this,arguments);       
}
Marionette.ItemView.prototype.render = function(){
  this.firstRender = false;
  fnRender.apply(this,arguments);
}

然后只需覆盖默认的 region#show,如果视图view.firstRender为 true,则尚未渲染,必须渲染它,否则无需执行任何操作。

Marionette.Region.prototype.show = function(view){    
  this.ensureEl();
  var isViewClosed = view.isClosed || _.isUndefined(view.$el);
  var isDifferentView = view !== this.currentView;
  if (isDifferentView) {
    this.close();
  }
  // These lines changed from default marionette action
  if(view.firstRender){
    view.render();
  }else{
    // Don anything else!
  }
  // End of overrided code

  if (isDifferentView || isViewClosed) {
    this.open(view);
  }
  this.currentView = view;
  Marionette.triggerMethod.call(this, "show", view);
  Marionette.triggerMethod.call(view, "show");
}

编辑

上面的解决方案工作正常,另一种方法是(这将假设视图已呈现):

Marionette.Region.prototype.showWithoutRender = function(view){
  this.ensureEl();
  var isViewClosed = view.isClosed || _.isUndefined(view.$el);
  var isDifferentView = view !== this.currentView;
  if (view !== this.currentView) {
    this.close();
  }
  if(isViewClosed || isDifferentView){
    this.open(view);
  }
  this.currentView = view;
  Marionette.triggerMethod.call(this, "show", view);
  Marionette.triggerMethod.call(view, "show");
}
// assume your view is already rendered
region.ensureEl();
region.open(myView);

不建议这样做,如果可以的话,请使用region.show(myView)。由于它将关闭上一个视图以清理所有事件侦听器等......