2

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

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

view = new View({model:firstModel})

view.swapModel(newModel)

这就是我换出视图模型所要做的一切吗?我应该计划其他副作用吗?应对这种互换的最佳方式是什么?我应该在 swapModel 中触发交换事件吗?

谢谢!

4

3 回答 3

9

不要在视图中交换模型。您将遇到与 DOM 事件、视图中的模型事件等相关的各种问题。我已经尝试了十几次或更多次,并且在每种情况下,我都重新编写了我的代码,以便我会为每个模型创建一个新的视图实例。代码更干净、更简单、更容易理解、更容易维护和使用。

于 2012-04-13T13:02:35.943 回答
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()
于 2012-04-13T04:15:44.093 回答
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

您可以进一步锁定 Collection 规则,但我认为它是一个很好的例子,可以让您继续前进。

于 2015-01-22T11:33:30.237 回答