0

次の例のコンテキストでの MVC の使用法には疑問があります。

ちょっとした描画アプリケーションの例を考えてみましょう。

  1. たとえば、ユーザーが選択した形状の角度を入力できるテキストボックスがあるとします。期待される結果は、選択した各形状がテキストボックスで指定された角度に従って回転するはずです。

  2. ShapeView という名前のビューであるシェイプ オブジェクトがあるとします。指定されたビューには、その位置、現在の回転角度、ストロークの色、塗りつぶしの色などの独自のデータがあります。したがって、ShapeModel として形状のモデルがあります。

  3. これで、このテキスト ボックスと複数の形状ビューを処理する Controller ができました。テキストボックスの値を変更すると、コントローラーは必要な手順を実行して形状を回転させることができます。

質問:

疑問は、コントローラーがシェイプビューの shapeModel に直接アクセスして、rotate メソッドを呼び出す必要があるかどうかです。または、コントローラーは shapeModel の回転メソッドを内部的に呼び出す shapeView の回転メソッドを呼び出す必要がありますか?

要するに、外部エンティティはビューのモデルに直接アクセスする必要がありますか? それとも、ビューのみを通過する必要がありますか? モデルに直接アクセスするのは良い考えですか? アクセスした場合の問題や懸念事項はありますか?

4

1 に答える 1

1

バックボーンのビューはコントローラーとして動作しています。

例えば

  ShapeView = Backbone.View.extend
    el: "input#angle"
    events: 
      "onkeypress" : "update_angle"
    update_angle: (ev)->
      angle = $(ev.target).val()
      @rotate(angle)

ほとんどの場合、同じビューに追加のコントローラーは必要ありません。ShapeViewコントローラーはすべてを単独で処理できます。作成されたビューを担当します。他のView Controllerまたはモデルにアクセスする必要がある場合は、それらをグローバル名前空間にフックできます。App = App || {}

多くの値があり、それらの値に他のコントローラーからアクセスする必要がある場合は、Shapeモデルを作成できます。そのモデルビュー コントローラー内に保持するのではなく、グローバル名前空間にバインドし、グローバル名前空間を介してその属性を設定する必要があります。

このようにモデルにイベントをバインドすることもできます

shapeView = new ShapeView
shape = new Shape
shapeView.listenTo shape, "change:angle", shapeView.update_angle

このようにして、複数のコントローラーを使用して同じデータ モデルをリッスンし、それに応じてビューを更新することができます。

モデル コントローラーとビュー コントローラーは、できる限り分離する必要があります。

于 2013-11-06T10:26:06.447 に答える