2012-02-19 3 views
2

В router.js. Консоль Firebug предупреждает, что Backbone имеет значение null. Зачем???BackboneJS + Requirejs: Магистральная ошибка

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

ответ

3

Backbone не поддерживает AMD и не регистрируется в качестве модуля. При необходимости он обычно регистрируется как глобальный объект Backbone, так как 1.3 Underscore не поддерживает AMD ни один, и если вам потребуются Backbone и Underscore в рамках Backbone и _ namespaces, они будут перезаписывать свои значения в этой области модулей до undefined.

jQuery поддерживает AMD, но также регистрирует себя как глобальный экземпляр. В основном это означает, что вам не нужно требовать jquery, underscore и backbone несколько раз - этого достаточно, если вы сделаете это один раз в своем главном скрипте requirejs

+0

Поскольку это Безразлично «Поддерживать AMD, нужно ли это использовать? Будет ли еще больше проблем при создании сборки? Спасибо за Ваш ответ. – user469652

+0

Он отлично работает с AMD, он просто не регистрируется как модуль AMD, а затем регистрируется в глобальной области. Мы использовали requirejs и позвоночник при построении http://wunderkit.com и не можем себе представить, что не используем эти два! :) –

+2

Вы также можете получить версию Backbone и Underscore, совместимую с AMD, здесь ... https: //github.com/amdjs – jcreamer898

-2

Альтернативой является взломать библиотеку backbone.js.

Примечание. Это позволит вам ссылаться на библиотеку Backbone.js и underscore.js в пределах вашего require.js, но это не помешает им добавить в объект глобального пространства имен/окон. Это требует немного большего взлома.

  1. Поиск:

    (function(){var l=this,y= 
    
  2. Замените его:

    define('backbone',['underscore','jquery'],function(_,$){ 
    var l = this; 
    (function(){var y= 
    
  3. Добавить это в нижней части страницы:

    return l.Backbone; 
    }); 
    

Затем сделайте то же самое для underscore.js

  1. Приставка начало с:

    define('underscore',function(){ 
    
  2. Добавить в нижней части страницы:

    return this._; 
    });