在Backbone.js中未定义传递参数到initialize()视图

时间:2018-01-22 14:13:32

标签: javascript backbone.js requirejs

我正在使用Backbone.js应用程序,该应用程序使用所有视图和子视图扩展的“主视图”。

主视图

define(['backbone'], function (Backbone) {
   return Backbone.View.extend({
      events: {

      },

      showSuccess: function (msg) {
         alert(msg);
      }
   });
});

然后我有一个生成页面的主视图,这可以调用较小部分的子视图:

define(['backbone','masterView', 'mySubView'], function (Backbone, mView, mySubView) {
   var mainView = mView.extend({
      events: function () {
         return _.extend({}, coreView.prototype.events, {

         });
      },

      render: function () {
         var sub = new mySubView({'foo': 'bar'});
      }
   });
   return new mainView();
});

最后,我的子视图,在初始化时,它表示options未定义。

define(['backbone','masterView', 'mySubView'], function (Backbone, mView, mySubView) {
   var subView = mView.extend({
      events: function () {
         return _.extend({}, coreView.prototype.events, {

         });
      },

      initialize: function (options) {
         console.log(options);
      }
   });
   return new subView();
});

在此设置中,为什么optionsMainView传递时未定义?如果子视图不扩展masterView,而是扩展Backbone.view,则可以正常工作。

1 个答案:

答案 0 :(得分:4)

子视图文件中的最后一行:

return new subView();

您正在返回一个新实例,而不是在子视图模块中返回构造函数。它应该是:

return subView;

请注意,as a convention, JavaScript代码应使用 PascalCase 作为类型(构造函数,类等),而实例(变量,属性等)应使用 camelCase

另外,我在how to design a good base class with Backbone上分享了一些技巧。您可以将合并事件的职责转移到基类而不是每个子类。