2012-04-13 80 views
2

基本上我試圖找出交換模型並對該事件做出反應的最佳方法。交換視圖的模型?

class View extends Backbone.View 
    initialize:()-> 
     #do stuff 
    swapModel: (newModel)-> 
     @model = newModel 

view = new View({model:firstModel}) 

view.swapModel(newModel) 

這是我需要做的所有事情來換出一個視圖的模型嗎?我應該計劃有其他副作用嗎?迴應這個交換的最佳方式是什麼?我應該在swapModel中觸發交換事件嗎?

謝謝!

+0

我認爲你需要重新綁定在你的視圖中正在你的模型上聽到的任何事件,如果你有它們。 – kinakuta 2012-04-13 04:01:38

+1

爲什麼不只是摧毀舊的觀點,並創建一個新的觀點? – 2012-04-13 04:09:26

+0

@ muistooshort也許我可以,但部分意見工作是對新模型的創建做出反應。 dom中的所有內容都需要保留,並且在模型切換時它會對dom進行一些更改。如果我認爲它可能工作,那麼交換模型似乎更容易。 – fancy 2012-04-13 04:15:39

回答

9

不要在視圖中交換模型。你會遇到與DOM事件,視圖中的模型事件等相關的各種問題。我試着做了十幾次甚至更多,並且在每一種情況下,我重新編寫了我的代碼,以便我會爲每個模型創建一個新的視圖實例。代碼更清晰,更簡單,更容易理解,更易於維護和使用。

+0

謝謝Derick,我相信你對所有這些東西的看法。這可能會爲我節省很多時間。 :) – fancy 2012-04-15 15:17:24

1

一種非常簡單的例子。你爲什麼試圖交換模型?

MyView = Backbone.View.extend({ 
    initialize: function() { 

    this.myTrigger = {}; 
    _.extend(this.myTrigger, Backbone.Events); 

    this.myTrigger.on("modelChange", function(msg) { 
     alert("Triggered " + msg); 
    },this); 

    }, 
    swapModel: function(model) { 
     // do something with model 
     // then trigger listeners 
     this.myTrigger.trigger("modelChange", "a model change event"); 
    } 
}); 

var myview = new MyView() 
myview.swapModel() 
1

您可以使用只允許一個模型的集合。這樣您就不會觸摸模型,並可以根據需要多次調用渲染。就像這樣:

var SpecialCollection = Backbone.Collection.extend({ 
    swap: function (model) { 
     //remove all models 
     this.reset(); 
     //add one model 
     this.add(model); 
    } 
}); 

var MyView = Backbone.View.extend({ 
    initialize: function(){ 
     this.listenTo(this.collection, 'add', this.render); 
    }, 
    render: function() { 
     this.model = this.collection.first() 
     //do your normal rendering here 
    } 
}); 

var c = new SpecialCollection(); 
var v = new MyView({collection: c}); 
c.swap({name: 'Sam'}); 
//view should render 
c.swap({name: 'Dave'}); 
//view should render 

你可以進一步鎖定收集規則,但我認爲它是一個很好的例子,讓你走。