2

私がバックボーンを使用している場合、どちらか(または両方)がデータを設定する「正しい」方法ですか?Backbone.jsモデルとビューのセット

これらの作業の
// 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({ 
    events: { 
    "click .toggle" : "toggleVisibility" 
    }, 

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

明らかにどちらか一方が、私の質問は、モデルにオフにプッシュする必要がありますどのくらいのそのロジックのでしょうか?それは、このようなモデルに関数を作成するために理にかなって

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

::、たとえば、私は2つの変数を更新し、状況がある場合

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

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

思考?

答えて

0

あなたが本当に素晴らしいアイデアではありません、あなたのモデルにビューロジックを混合しているようです。私はそこにあると思うでしょうあなたのモデルのいくつかのデータは、それがバインドされているビューを表示する必要があります(削除されたもの:trueなど)が、その属性の変更に基づいて可視性を切り替える必要があります。私は次のようなことを想像しています。

SomeModel = Backbone.Model.extend(); 

SomeView = Backbone.View.extend({ 
    events: { 
    "click .toggle" : "toggleDeleted" 
    }, 

    initialize: function() { 
     this.model.on('change:deleted', this.toggleVisibility); 
    }, 

    toggleDeleted: function() { 
    var deleted = this.model.get('deleted'); 
    this.model.set({deleted: !deleted}); 
    }, 

    toggleVisibility: function(){ 
    this.$el.toggle(); // jQuery function toggling visibility 
    } 
}); 

// Somewhere in your "controller" logic 
var someModel = new SomeModel({deleted: false}); 
var someView = new SomeView({model: someModel, el: DOMelement}); 

このようにして、あなたのビューロジックはあなたのビューであり、あなたのモデルではありません。バックボーンはスキーマを定義する必要がないのでモデルは空ですが、一般的にはある時点で機能を追加します。

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. 
     ........ 
    } 
}); 
1

あなたがビューコントローラ間の差別化に慣れているので、それが汚れて感じるかもしれません。しかし、Backbone.jsには存在しません。もコントローラです。 これを理解すると、モデルとのやりとりが目にはずっと簡単になります。

私の意見では、あなたの問題を解決する正しい方法は、あなたが導入した方法の組み合わせです。場所にSomeModel.toggleのままにして、あなたのビューでは、実行します。

toggleVisibility: function() { this.model.toggle(); } 
0

同様の質問が、ここでは偉大な答えは、で:最も以前のコメンターと同様Should views set model data?

、一般的な答えがあるように思わ:あなたが表示要素を変更している場合は、ビュー内のデータを設定します。ビジネスロジックを設定する場合は、モデルにデータを設定します。

関連する問題