4

現在のルート位置を離れた後、私のビューは破棄されるはずです。

したがって、この図の例では、ユーザーが資格情報を入力した後にログイン ビューを破棄する必要があります。

ルート

Backbone.Routerイベントを使用してこれを解決しようとしました:

var Router = Backbone.Router.extend({
    initialize: function () {
        Backbone.history.start();
    },
    routes: {
        "sample" : "sample"
    },
    sample: function(){
      // Build view
      var demoView = $("<div/>")
          .appendTo(document.body)  
          .text("I am lost!");

      // Destroy view
      this.once('route', function(){
        demoView.remove(); 
      });
    },
});

残念ながら、ルートが実行されたにルート イベントが発生するため、これは機能しません。

http://jsfiddle.net/hcuX9/

ルート位置を離れた後にビューを破棄する解決策はありますか?

新しいイベントを Backbone.jsにハックする必要がありますか?

4

3 に答える 3

3

私がよく使うのは、App.currentレンダリング中の現在のビューを指す変数を用意することです。

各ルート (またはあなたの場合は関連するもの) の上部で、現在のビューを削除してからApp.current、新しいビューに割り当てます。

someRoute: function() {
  if(App.current && App.current.remove) App.current.remove();  

  // Asign a new current page
  App.current = new SomeView();
  ...
}

そうすれば、ルートごとに 1 つのビューだけをライブにして、あなたのような問題を取り除くことができます。

すべてのルートの先頭で remove メソッドをチェックしApp.currentて呼び出すのが嫌な場合は、Backbone.history ルート イベントをリッスンして、そこにそのロジックを挿入できます。

Backbone.history.on('route', function() {
  if(App.current && App.current.remove) App.current.remove();  
});
于 2013-03-31T06:41:30.053 に答える
0

ここでは、現在のルートではない単一のイベントに頼ることができないため、代わりに入ってくるルート イベントをリッスンするためにonandを使用しています。現在のルートではないルートを受け取った場合は、ビューを破棄してリスナーを削除できます。offonce

  // Destroy view
  var self = this;
  var onRoute = function(route, params){
    if(route !== 'sample'){
      demoView.remove();
      self.off('route', onRoute);
    }
  };
  this.on('route', onRoute);

ここでテスト フィドルを変更しました: http://jsfiddle.net/rgthree/hcuX9/3/


あなたのフィドル(あなたの質問ではありません)が別のビューに直接移動するための別のオプション。これにより、他のルートのイベントがsample2 ルートの後に発生します。このため、上記はビューを削除します。これで、より完成度が高くなりました。これを処理するよりハックな方法は、現在のルートが起動されるまでリッスンしないように、単純にoncein を延期することです。setTimeout

// Destroy view
var self = this;
setTimeout(function(){        
  self.once('route', function(){
    demoView.remove(); 
  });
}, 0);

ここでこのメソッドのフィドルを確認できます: http://jsfiddle.net/rgthree/hcuX9/4/

于 2013-03-29T20:39:25.207 に答える