骨干木偶展示区呈现无 [英] Backbone Marionette Region show without render

查看:90
本文介绍了骨干木偶展示区呈现无的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有可能把一个已经呈现为骨干木偶区域的图,而无需再次渲染呢?

例如:

  region.show(MyView的); //这将调用呈现在MyView的

我不希望该地区再次渲染我的看法。

如果我做的:

  region.attachView(MyView的); //这不会呈现MyView的,但它也不会表现出来


解决方案

第一个覆盖木偶ItemView控件构造和呈现这样的(如果你想在的CollectionView使用它,CompositeView中也覆盖它们的这些方法):

  VAR fnCons = Marionette.ItemView.prototype.constructor,
    fnRender = Marionette.ItemView.prototype.render;
Marionette.ItemView.prototype.constructor =功能(){
  this.firstRender =真;
  fnCons.apply(这一点,参数);
}Marionette.ItemView.prototype.render =功能(){
  this.firstRender = FALSE;
  fnRender.apply(这一点,参数);
}

然后就是覆盖默认的区域#显示,如果观点是 view.firstRender 是真实的它尚未呈现,必须使其,否则不需要采取任何行动。

  Marionette.Region.prototype.show =功能(视图){
  this.ensureEl();  VAR isViewClosed = view.isClosed || _.isUndefined(查看$ EL);  VAR isDifferentView =视图== this.currentView!;  如果(isDifferentView){
    this.close();
  }
  //这些线路从默认的提线木偶的动作变化
  如果(view.firstRender){
    view.render();
  }其他{
    //不要什么都重要!
  }
  // overrided code结束
  如果(isDifferentView || isViewClosed){
    this.open(视图);
  }  this.currentView =视图。  Marionette.triggerMethod.call(这一点,秀,查看);
  Marionette.triggerMethod.call(看来,秀);
}

修改

上面的解决方案正常工作,另一种方式是(这将假设视图渲染):

  Marionette.Region.prototype.showWithoutRender =功能(视图){
  this.ensureEl();  VAR isViewClosed = view.isClosed || _.isUndefined(查看$ EL);
  VAR isDifferentView =视图== this.currentView!;  如果(查看!== this.currentView){
    this.close();
  }  如果(isViewClosed || isDifferentView){
    this.open(视图);
  }
  this.currentView =视图。  Marionette.triggerMethod.call(这一点,秀,查看);
  Marionette.triggerMethod.call(看来,秀);
}

Is it possible to put a view that is already rendered into a backbone marionette region without rendering it again?

For example:

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

I don't want the region to render my view again.

If I do:

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

解决方案

First override marionette ItemView constructor and render like this (if you want to use it in CollectionView and CompositeView override these methods of them too):

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);
}

And then just override default region#show, if view is view.firstRender is true it's not rendered yet and must render it, else no action required.

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");
}

Edit

The solution above works fine, another way is (this will assume that view is rendered) :

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");
}

这篇关于骨干木偶展示区呈现无的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆