BackboneJS + Requirejs:Backbone是空问题

时间:2012-02-19 01:33:06

标签: backbone.js requirejs

在router.js中。 firebug控制台警告Backbone在那里是空的。为什么???

app.js

define([
  'order!jQuery',
  'order!Underscore',
  'order!Backbone',
  'order!router'  // Request router.js
],
function($, _, Backbone, Router){

    App = {
        initialize: function() {

            console.log("app.js initalize");
            Router.initialize();
        }
    };

    return App;
});

router.js

define([
   'order!Underscore',
   'order!Backbone'
],
function(_, Backbone){

    var AppRouter = Backbone.Router.extend({      
        // Console shows Backbone is null here, why? 
        // I'm sure the config is correct.
        routes: {

            '*actions': "defaultAction"
        },

        defaultAction: function(actions){
            // We have no matching route, lets just log what the URL was
            console.log('No route:', actions);
        }
    });

    var initialize = function(){
        console.log("Router initialize");
        var app_router = new AppRouter;

        Backbone.history.start();
    };
    return {
        initialize: initialize
    };

});

enter image description here

2 个答案:

答案 0 :(得分:3)

Backbone不支持AMD,也没有注册为模块。当需要时,它通常作为全局Backbone对象注册,因为1.3 Underscore既不支持AMD,如果你在Backbone和_ namespace下需要Backbone和Underscore,它们会将这个模块范围内的值覆盖到{{1}原因。

jQuery支持AMD,但它也将自己注册为全局实例。基本上它意味着你不需要多次需要jquery,下划线和骨干 - 如果你在requirejs主脚本中执行一次就足够了

答案 1 :(得分:-2)

另一种方法是破解backbone.js库。

注意:这将允许您在require.js定义中引用Backbone.js和underscore.js库,但它不会阻止它们被添加到全局命名空间/窗口对象中。这需要更多的黑客攻击。

  1. 查找

    (function(){var l=this,y=
    
  2. 将其替换为:

    define('backbone',['underscore','jquery'],function(_,$){
    var l = this;
    (function(){var y=
    
  3. 将其添加到页面底部:

    return l.Backbone;
    });
    
  4. 然后对underscore.js

    执行相同的操作
    1. 以:

      开头
      define('underscore',function(){
      
    2. 添加到页面底部:

      return this._;
      });