8

我熟悉构建主干应用程序,但正在尝试将其转换为使用 requirejs,我面临的问题是当我尝试扩展父视图时,它是undefined

尝试将 base-view.js 扩展到 properties-view.js 时

 define(['backbone','underscore','jquery','views/node/base-view'],                  
   function(Backbone, _, $, NodeBaseView){
     PropertiesView = NodeBaseView.extend({

        });
     }
});

在父基础视图中实例化子视图

    define(['backbone','underscore','jquery','views/node/properites-view'], function(Backbone, _, $, PropertiesView){
    NodeBaseView = Backbone.View.extend({
    ..
        new PropertiesView({});
    ..
    });

});

这里的 NodeBaseView 是undefined在尝试为 PropertiesView 扩展它时。有什么帮助吗?

注意:我正在使用 AMD 版本的骨干网和下划线https://github.com/amdjs

4

3 回答 3

3

让我们假设这个定义位于“views/main”中

define(['backbone', 'views/node/base'],                          
    function(Backbone, BaseView){
        var MainView = BaseView.extend({

        });

        return MainView;
    }
);

然后作为您的孩子查看:

define(['backbone', 'views/node/base'],                          
    function(Backbone, BaseView) {
        var PropertiesView = BaseView.extend({

        });

        return PropertiesView;
    }
);

然后在遥远的宇宙中的某个地方:

myView = new MainView();

使用手册中的示例:

define(['backbone', 'views/node/base'],                          
    function(Backbone, BaseView){
        var MainView = BaseView.extend({

        });

        return MainView;
    }
);

然后

define(['backbone'], function (Backbone) {                  
  var BaseView;

  require(['views/node/base'], function(b){
      BaseView = b;
  });

  var PropertiesView = BaseView.extend({

  });

  return PropertiesView;
});
于 2013-12-12T13:15:29.367 回答
3

这里的问题似乎是循环依赖。基础视图需要属性视图,反之亦然。这导致其中一个未定义。

于 2013-03-18T17:03:11.260 回答
1

您可以动态要求 PropertiesView,这样 BaseView 就不必依赖它。

define(['backbone','underscore','jquery','views/node/base-view'],
   function(Backbone, _, $, NodeBaseView){
     PropertiesView = NodeBaseView.extend({

        });
     }
     return PropertiesView;
});

在这里你需要 PropertiesView

define(['backbone','underscore','jquery'],
    function(Backbone, _, $, PropertiesView){
        NodeBaseView = Backbone.View.extend({
        ..
            var PropertiesView = require('views/node/properites-view');
        ..
            new PropertiesView({});
        ..
        });

});

例子:

define(['views/node/base-view', 'views/node/properites-view'],
    function(NodeBaseView, PropertiesView){
        return {
            base: new NodeBaseView()
        }
});
于 2013-12-13T14:52:00.510 回答