交换视图的模型?

时间:2012-04-13 03:40:54

标签: javascript backbone.js coffeescript models

基本上我正试图找出交换模型并对该事件做出反应的最佳方法。

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

view = new View({model:firstModel})

view.swapModel(newModel)

我是否需要更换视图的模型?我应该计划还有其他副作用吗?什么是回应这种交换的最佳方式?我应该在swapModel中触发交换事件吗?

谢谢!

3 个答案:

答案 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

您可以进一步锁定收藏规则,但我认为这是让您前往的好例子。