所以,我正在将一个小的Backbone应用程序移植到RequireJS设置,令人惊讶的是我遇到了这个代码的问题:
define([
'jquery',
'underscore',
'backbone',
'channel',
'templates'
], function ($, _, Backbone, channel, JST) {
'use strict';
var SomeView = Backbone.View.extend({
// ... template, render
initialize: function () {
var that = this;
// was working previosuly, not sure why not now...
// this.collection.on('reset', function() {
// that.render()
// });
// hack:
this.collection.deferred.then(function () {
that.render()
});
所以,我发现引入这样的事件总线有助于:
this.listenTo(channel, 'reset', function (id) {
that.render()
});
但我不确定我是否会错过其他的东西。具有RequireJS的模块之间的通信是否通常涉及事件总线,还是可以以其他方式调试丢失的“重置”事件?
谢谢!
答案 0 :(得分:1)
你能为“所有”事件添加一个监听器来查看集合上被触发的内容吗?
this.listenTo(this.collection, 'all', function(eventName) {
console.log(eventName);
});
如果您在此迁移过程中升级了主干网,则可能会看到之前看到“重置”事件的“同步”事件。这是迁移到Backbone 1.0时的一个变化:http://backbonejs.org/#changelog
如果是这种情况,那么您可以更新您正在侦听的事件,或者将选项传递给collection.fetch:
collection.fetch({ reset: true });
编辑:
同样,您不必将this
上下文保存到变量中。您可以将其作为参数传递给this.collection.on
,并自动为this.listenTo
完成。所以而不是:
var that = this;
this.collection.on('reset', function() {
that.render()
});
你可以这样做:
this.collection.on('reset', this.render, this);
或(更好):
this.listenTo(this.collection, this.render);
当您在视图上调用.remove
时将取消绑定事件侦听器,并帮助防止内存泄漏。
答案 1 :(得分:1)
您是否也不想要收藏品?
define([
'jquery',
'underscore',
'backbone',
'channel',
'templates',
'collections/movies'
], function ($, _, Backbone, channel, JST, Movies) {
'use strict';
var SomeView = Backbone.View.extend({
//....
然后你可以这样做:
initialize: function () {
this.collection = Movies;
this.collection.on('reset', function() {
that.render();
});
或只是使用电影:
Movies.on('reset', function() {
that.render();
});