BackboneJS + Requirejs: Backbone является нулевой проблемой - PullRequest
2 голосов
/ 19 февраля 2012

В роутере.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 ]

3 голосов
/ 19 февраля 2012

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

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

0 голосов
/ 21 мая 2012

Альтернатива - взломать библиотеку 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._;
    });
    
...