基本上我正试图找出交换模型并对该事件做出反应的最佳方法。
class View extends Backbone.View
initialize: ()->
#do stuff
swapModel: (newModel)->
@model = newModel
view = new View({model:firstModel})
view.swapModel(newModel)
我是否需要更换视图的模型?我应该计划还有其他副作用吗?什么是回应这种交换的最佳方式?我应该在swapModel中触发交换事件吗?
谢谢!
答案 0 :(得分:9)
不要在视图中交换模型。您将遇到与DOM事件,视图中的模型事件等相关的各种问题。我已经尝试过十几次或更多次,并且在每一个案例中,我重新编写了我的代码,以便我会为每个模型创建一个新的视图实例。代码更清晰,更简单,更易于理解,更易于维护和使用。
答案 1 :(得分: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()
答案 2 :(得分: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
您可以进一步锁定收藏规则,但我认为这是让您前往的好例子。