0

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

谢谢!

4

2 回答 2

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器,并有助于防止内存泄漏。

于 2013-09-29T22:08:54.550 回答
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 主干需要示例

于 2013-09-30T14:34:37.697 回答