2012-02-14 28 views
0

I持って、次のBACKBONE.JSモデルとコレクション:私は変更にサブビューをバインドしようとしていますバックボーンビューでモデルの変更が検出されないのはなぜですか?

// View 
lr.MapView = Backbone.View.extend({ 
    el: $('#wrapper'), 
    initialize: function() { 
    this.date = this.options.date; 
    _.bindAll(this, "render", "addAllEvents", "addOneEvent", "showNextDay", "collectData"); 
    this.collectData(); 
    }, 
    events: { 
    "click #next": "showNextDay", 
    }, 
    collectData: function() { 
    var that = this; 
    if (this.collection) this.collection.reset(); 
    this.collection = new lr.Events([], { date : this.date }); 
    this.collection.fetch({ 
     success: function(resp) { 
     that.render(); 
     that.addAllEvents(); 
     } 
    });  
    }, 
    showNextDay: function() { 
    this.date = this.date.add(1).days(); 
    this.collectData(); 
    }, 
    addAllEvents: function() { 
    this.collection.each(this.addOneEvent); 
    }, 
    addOneEvent: function(e) { 
    var ev = new lr.EventView({ 
     model: e, 
     parentView: this 
    }); 
    }, 
    ... 
}); 

// Sub-view 
lr.EventView = Backbone.View.extend({ 
    initialize: function() { 
    var that = this; 
    this.model.bind('change', function() { 
     console.log('foo'); 
     that.remove(); 
    }); 
    } 
    ... 
}); 

:ビューとそのサブビューで使用されている

// Model 
lr.Event = Backbone.Model.extend({}); 

// Collection 
lr.Events = Backbone.Collection.extend({ 
    model: lr.Event, 
    initialize: function(models, options) { 
    this.date = options.date; 
    }, 
    url: function() { 
    return '/events' + '?date=' + this.date.toString('yyyy-MM-dd'); 
    } 
}); 

その関連モデルに変換する。だから、this.collection.reset()と呼ぶと、console.log('foo')が呼び出されると思います。そうではありません。私はconsole.logを以前にコレクションしていましたが、私はそれをリセットした後、 "何かから何もない"ことは間違いありませんので、私は何とかサブビューのモデルへの結合を台無しにしていると思います。

誰でもエラーが表示されますか?

答えて

2

モデルを持たないreset()を呼び出すとコレクションは空になりますが、'変更'のモデルは存在しません。 「変更」イベントは、モデルの一部の属性がchangesの場合に発生します。 reset()を呼び出すと、'リセット'イベントがコレクション自体に出現します(コレクションを取得するときにもトリガーされます)。これが発生すると、UIをリセットして、すべてのサブビューアイテムを作成してレンダリングする必要があります。(in your case, it looks like you would call render and addAllEvents when you get the reset event)

this.collection.on('reset', this.removeExistingEventViewsThenAddAllEvents, this); 

は今、イベントモデルのいくつかの属性が変更を行うとき、あなたは、あなたの変更ハンドラヒットします:

this.model.bind('change', function() { 
    console.log('foo'); 
    that.remove(); 
}); 

をしかし、私は本当にあなたがすると、イベントのビューを削除したい疑いますモデルが変わります。おそらく、再レンダリングしたり、JQueryを使ってその一部を更新したりしたいと思うでしょう。

+0

完全に意味があります。ありがとうございました! – AdamVickers

0

collection.reset()backbone.js v0.91、行609)は、コレクションを黙って削除し、必要に応じてコレクションを再投入した後にのみ、resetイベントを発生させます。

collection.remove(model(s));(ライン548)は、各モデルにremoveイベントをトリガし、あなたは、各モデルにremoveイベントをトリガする collection.remove(collection.models);を使用することができます。

+0

バックボーンのドキュメントでは、 "モデルを引数として渡さずに' collection.reset() 'を呼び出すと、コレクション全体が空になります。コレクション全体が空になっても、すべてのモデルが削除されて変更されるというわけではありませんか? http://documentcloud.github.com/backbone/#Collection-reset – AdamVickers

+0

まあ、ソースコードは、私が上記のことをするようです。バックボーンチームへのバグレポートや機能の提案に値するかもしれません。 – biziclop

関連する問題