Backbone.js :未捕获的类型错误:..不是构造函数

wn9m85ua  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(152)

我正在学习 Backbone 和JavaScript。我被一个错误卡住了,这个错误可能与纯JavaScript而不是 Backbone 有关。
在完成Backbone的教程时(不使用requireJS),我发现了下面的代码行。

var FirstSubViewModel = Backbone.View.extend({
    render: function() {
    var source = $("#vehicleTemplate").html();
    var template = _.template(source);

    this.$el.html(template(this.model.toJSON()));
    this.$el.attr("data-color", this.model.get("color"));

    return this;
},
  });

我们可以清楚地看到代码returns this,并且一切正常。
现在我尝试在我自己的代码库中做同样的事情(我已经使用了require.JS。
我的视图模型:有错误:无法运作

define(['backbone'], function(Backbone) {
  var FirstSubViewModel = Backbone.View.extend({
    template: _.template($('#myChart-template').html()),
    render: function() {
      $(this.el).html(this.template());
      var ctx = $(this.el).find('#lineChart')[0];
        return this; 
},
    initialize: function() {
      this.render();
    }
  });
});

我的控制器:

define(['backbone', 'FirstSubViewModel'], function(Backbone, FirstSubViewModel)
{   var ch = new dashboardModel.chart({});
        new FirstSubViewModel({
                ^^ HERE I GET ERROR
        el: '#chartAnchor1',
          model: ch
        });
});

我的视图模型:工作得很好

define(['backbone'], function(Backbone) {
      var FirstSubViewModel = Backbone.View.extend({
        template: _.template($('#myChart-template').html()),
        render: function() {
          $(this.el).html(this.template());
          var ctx = $(this.el).find('#lineChart')[0];
           // return this; Commented Out!**
    },
        initialize: function() {
          this.render();
        }
      });
return FirstSubViewModel;
    });

如果我在底部使用return FirstSubViewModel,而不是在render函数中返回它,一切都可以正常工作。但是我想在render function中尝试return this,并希望一切都正常工作。我不想在最后使用return FirstSubViewModel
在渲染函数中使用“return this”时出错:
FirstSubViewModel不是构造函数

mklgxw1f

mklgxw1f1#

最后一个返回值定义了其他模块中将包含的内容,在本例中是必需的。如果没有此返回值,则此模块返回undefined
让我们在控制台中尝试:

x = undefined
new x()

TypeError:x不是构造函数
return FirstSubViewModel是必需的。建议在渲染函数中使用return this
编码:

define(['backbone'], function (Backbone) {
    var FirstSubViewModel = Backbone.View.extend({
        template: _.template($('#myChart-template').html()),
        render: function () {
            console.log("inside first sub view render");
            $(this.el).html(this.template());
            var ctx = $(this.el).find('#lineChart')[0];
            return this;

        },
        initialize: function () {
            this.render();
        }
    });

    return FirstSubViewModel; // Works as expected.
});

相关问题