移动到RequireJS设置时,事件会丢失

时间:2013-09-29 21:14:16

标签: backbone.js requirejs

所以,我正在将一个小的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的模块之间的通信是否通常涉及事件总线,还是可以以其他方式调试丢失的“重置”事件?

谢谢!

2 个答案:

答案 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();
    });

基于:TODOMVC backbone_require Example