1

単一のモデルに対して複数のビューを作成する場合があります。ビューを閉じると、モデルをコレクションから削除します。複数のビューがある場合にモデルを破棄する場合

複数のビューの場合、モデルに依存する他のビューがあります。

モデルによってはビューが表示されないときはどうすればわかりますか?複数のビューの場合は、いつモデルを破棄する必要がありますか?

答えて

0

これは、適切な方法ではありませんが、それでもあなたはこの次

  1. dependentView

    をインクリメントし、各ビューの初期設定でモデルのdefaults

    var myModel = Backbone.Model.extend({ 
        defaults: function() { 
         return { 
          dependentViews: 0 
         }; 
        } 
    }); 
    
  2. dependentViewsを宣言し達成することができますが

    var view1 = Backbone.View.extend({ 
        initialize: function() { 
         this.model.set("dependentViews", 
          this.model.get("dependentViews") + 1); 
        } 
    }); 
    
    
    var view2 = Backbone.View.extend({ 
        initialize: function() { 
         this.model.set("dependentViews", 
          this.model.get("dependentViews") + 1); 
        } 
    }); 
    
  3. ビューを閉じるとデクリメントがdependentViewsになり、各ビューが破棄されると、dependentViewsという値がチェックされます。値が0の場合は、コレクションからモデルを削除します。

    onCloseView: function() { 
        this.model.set("dependentViews", 
         this.model.get("dependentViews") - 1); 
    
        if (this.model.get("dependentViews") === 0) { 
         //remove model from collection 
        } 
    } 
    
+0

'dependentViews'配列の背後にあるアイデアは正気ですが、' attributes'の一部にするのは良い考えではありません。これは永続的なデータの外に留まるべきロジックです。 –

+0

また、整数のように 'dependentViews 'を使っているのに気づきましたが、配列として初期化しました! –

+0

@EmileBergeronこれを指摘してくれてありがとう...私の投稿を編集 – Kenny

1

一般ビューのライフサイクルは、モデル/コレクションが変更させてはならない話すが、あなたはそれのための十分な理由を持っていると仮定。

ここでは、Kenny's answerを少し改善していますが、オブジェクトの配列としてdependentViewsを持つことをお勧めします(ビューが永続化されていない場合、ビューの依存性を維持しないことが最善です)。

var myModel = Backbone.Model.extend({ 
    initialize: function() { 
     this.dependentViews = []; 
    }, 

    addDependentView: function(view) { 
     this.dependentView.push(view); 
    }, 

    closeDependentView: function(view) { 
     this.dependentViews = _.without(this.dependentViews, view); 

     if (_.isEmpty(this.dependentViews)) { 
      //remove model from collection 
     } 
    } 
}) 

var view1 = Backbone.View.extend({ 
    initialize: function() { 
      this.model.addDependentView(this); 
    } 
}) 


var view2 = Backbone.View.extend({ 
    initialize: function() { 
      this.model.addDependentView(this); 
    } 
}) 

...

onCloseView: function() { 
    this.model.closeDependentView(this); 
} 

また、オブジェクトの配列は、依存関係のリストについては、便利で、将来的に必要であれば、あなたができることの道を来るかもしれない、従属ビューへのモデルからの呼び出しを行います。

可能性のある別の解決策は、モデルをリッスンするオブジェクトを追跡する手段として内部イベントリスナーレジスタを使用することです。しかし、それはもっと複雑になり、Backboneの内部機能に依存するでしょう。

+1

あなたのソリューションは機能していますが、責任がある複雑さを集中化して、これらの機能をモデルに組み込みます。モデル上の 'addDependentView'と' removeDependentView'関数のように。 –

+0

私は完全に同意する、私は答えを更新しました – mikeapr4

0

他の回答で示唆されているようにデータモデル内のビュー数を増やすことは良い考えではありません。

私はあなたがビューを作成し、これらのビューを破壊する「場」を持つ単一モデルのため、私は複数のビューを作成して頂く場合

を持っています。これは、親のビュー、コントローラ、ルータのインスタンスなどになる可能性があります。

あなたが持っていない場合、あなたは1つ必要です。

今後のクリーンアップのために、これらのビューインスタンスへの参照が必要です。

あなたがそれを持っていない場合は、それが必要です。

ビューを破棄しているときは、残っているインスタンス数を確認してください。モデルが存在しない場合はモデルを削除してください(一部のユーザー操作に応じてビューが削除された場合、削除の親に通知する必要があります)。

これは、ビュー・インスタンスとモデルの外部で実行する必要があります。

関連する問題