6

鉴于这样的事情:

View = Backbone.Marionette.ItemView.extend({ });

myView = new View();

//region already exists
myLayout.region.show(myView)

//some time later this gets called again:
myLayout.region.show(myView)

我可以在文档中看到 currentView 但这似乎只适用于初始化。显示视图后,我可以查询该区域以查看视图吗?视图实例或类型都会有所帮助。查看 Chrome 的调试器,我看不到该区域有任何有用的属性/方法。

这样做的动机是,如果某个区域已经显示静态项目视图,我不会再次在该区域中显示它,因为这可能(特别是如果涉及图像)会在屏幕上引起轻微的闪烁效果。

谢谢

——贾斯汀·威利

4

3 回答 3

11

您可以在调用 show 方法之前添加条件:

if (myLayout.region.currentView != myView)
    myLayout.region.show(myView)

因此,如果您尝试show使用相同的方式进行呼叫,View则不会显示。

如果你想打电话region.show(myView)一次,你可以通过这种方式检查:

if (_.isUndefined(myLayout.region.currentView))
    myLayout.region.show(myView)
于 2013-08-13T11:55:10.537 回答
7

您可以检查视图的isClosed$el属性。就像是

if (myView.isClosed || _.isUndefined(myView.$el)) {
  myLayout.region.show(myView);
}

这与区域检查视图是否关闭的方式相同:

show: function(view) {

  this.ensureEl();

  var isViewClosed = view.isClosed || _.isUndefined(view.$el);
  ...
于 2013-08-13T19:21:38.393 回答
0

我在这里冒险并假设OP的问题是基于通过导航中的锚标记或类似内容导航到应用程序的不同部分时的应用程序行为。

这就是我发现问题的方式,我简要地认为答案会拯救我的一天。尽管到目前为止这两个答案都是正确的,但它们并不能完全解决我遇到的问题。我想显示一个持久的导航栏。但是,我不希望它显示在登录页面上。我希望检测一个区域是否已经显示,我能够正确地让显示逻辑处理这个问题。

事实证明,我们都在正确的轨道上实施区域,因为这提供了精细的控制,但即使在实施上述之后,我发现我的导航栏仍然会“闪烁”并且基本上完全重新加载自身。

答案其实有点荒谬。不知何故,在过去两周我一直在做的所有 Backbone 教程和研究中,我从未遇到过实现 javascript 接口来中断正常链接行为的需要。每当单击导航项时,整个应用程序都会重新加载。路由运行正常,因此内容正确,但闪烁令人抓狂。

我在 Backbone.history.start({pushState: true}); 之后将以下内容添加到我的 app.js 文件中 代码:

// Holy crap this is SOOO important!
$(document).on("click", "a[href^='/']", function(event) {
  if (!event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {
    event.preventDefault();
    var url = $(event.currentTarget).attr("href").replace(/^\//, "");
    Backbone.history.navigate(url, { trigger: true });
  }
});

查看这篇文章以了解有关 keyPress 检测内容的一些解释。http://dev.tenfarms.com/posts/proper-link-handling

繁荣!在我的应用程序中添加这些东西后不再完全重新加载!

免责声明:我对 Backbone 非常陌生,以上对我来说是一个启示,这让我认为我可能在其他地方做错了,这种行为应该已经存在于 Backbone 中。如果我在这里犯了一个巨大的错误,请发表评论并帮助我纠正它。

于 2014-05-13T16:09:11.453 回答