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

それを行う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

1 つのモデルのみを許可するコレクションを使用できます。この方法では、モデルに触れる必要がなく、何度でも render を呼び出すことができます。このようなもの:

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 に答える