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の質問は、ナビゲーションのアンカータグなどを介してアプリのさまざまな部分に移動するときのアプリの動作に基づいていると想定しています。

これが私が質問を見つけた方法であり、答えが私の日を救うだろうと簡単に考えました. これまでのところ両方の答えは正しいですが、私が抱えていた問題を完全には解決していません。永続的なナビゲーション バーを表示したかったのです。ただし、ログインページに表示したくありませんでした。Region が既に表示されているかどうかを検出することで、表示ロジックにこれを適切に処理させることができると期待していました。

結局のところ、リージョンを実装することできめ細かい制御が可能になるため、リージョンを実装するのに正しい軌道に乗っていましたが、上記を実装した後でも、ナビゲーション バーがまだ「ちらつき」、本質的に完全に再読み込みされることがわかりました。

答えは実際には少しばかげています。過去 2 週間にわたって行ってきたすべてのバックボーンのチュートリアルと調査の中で、どういうわけか、通常のリンク動作を中断するために 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 に答える