2

如果我使用Backbone,哪些(或兩者)是設置數據的「正確」方式?Backbone.js模型與視圖SET

// 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}); 

會是有意義的在這樣的模式中創建一個函數:

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

這似乎只是矯枉過正對我來說,但視圖中的集合({})邏輯感覺很髒。

的思考?

回答

0

看來你是混合視圖邏輯到你的模型是不是一個真正的好主意。我會想象模型中的某些數據與是否有視圖有關,應該是否可見(類似於deleted: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?

與大多數以前的評論者,一般的答案似乎是:如果你改變顯示內容,在視圖中設置數據。如果您正在設置業務邏輯,請在模型中設置數據。