2

バックボーンを使用している場合、データを設定する「正しい」方法はどちら (または両方) ですか?

// Logic in the Model
// Can call from anywhere that has access
SomeModel = Backbone.Model.extend({
  defaults: {
    visible: false
  },

  toggle: function(visible){
    visible = typeof visible !== "undefined" ? visible : !this.get("visible");
    this.set({visible: visible});
  }
});

また

// Logic in the View
SomeView = Backbone.View.extend({
  events: {
    "click .toggle" : "toggleVisibility"
  },

  toggleVisibility: function(){
    this.model.set({visible: !this.model.get("visible")});
  }
});

明らかにこれらのいずれかが機能しますが、私の質問は、そのロジックのどの程度をモデルにプッシュする必要があるかということです。たとえば、2 つの変数を更新する状況があるとします。

this.model.set({visible: false, foo: bar, something: else});

次のようにモデルに関数を作成することは理にかなっていますか?

someFunction: function(visible, foo, something){
  this.set({visible: visible, foo: foo, something: something});
}

私にはやり過ぎのように思えますが、ビューの set({}) ロジックは汚れているように感じます。

考え?

4

4 に答える 4

1

トグル関数をモデルのメンバーにして、ビューから呼び出して、実装の詳細を非表示にします。モデルは一度に複数のビューで表すことができるため、一般的なモデル ロジックはそこに集中させる必要があります。

たぶん次のようなものです:

// Logic in the Model
// Can call from anywhere that has access
SomeModel = Backbone.Model.extend({
  defaults: {
    visible: false
  },

  toggle: function(visible){
    visible = typeof visible !== "undefined" ? visible : !this.get("visible");
    this.set({visible: visible});
  }
});
OR

// Logic in the View
SomeView = Backbone.View.extend({
  initialize: function() {
      this.model.bind('change:visibility',this.changeVisibility);
  }
  events: {
    "click .toggle" : "toggleVisibility"
  },

  toggleVisibility: function(){
    this.model.toggle();
  }
  changeVisibility: function() { 
      ........
      /// seems like alot of extra work to get to this point
      /// but remember, all views for the model are will receive this
      /// event now, not just the one that received the UI click
      /// whether or not that's the behavior you want is up to you. 
      ........
  }
});
于 2012-04-19T13:04:37.267 に答える
1

ビューコントローラーの区別に慣れているため、汚いと感じるかもしれません。ただし、Backbone.js には存在しません。ビューもコントローラーです。それを理解すると、モデルとのやり取りがずっと楽になります...

私の意見では、問題を解決する正しい方法は、紹介した方法を組み合わせることです。そのままSomeModel.toggleにして、ビューで次のことを行います。

    toggleVisibility: function() { this.model.toggle(); }
于 2012-04-19T13:05:07.197 に答える
0

同様の質問と優れた回答がここにあります:ビューはモデル データを設定する必要がありますか?

以前のほとんどのコメント投稿者と同様に、一般的な答えは次のようです。表示要素を変更する場合は、ビューにデータを設定します。ビジネス ロジックを設定する場合は、モデルにデータを設定します。

于 2012-07-21T23:32:27.377 に答える