Requirejs + Backbone.js: TypeError: Не удается передать в маршрутизатор - маршрутизатор не является функцией?

0

Я все еще пытаюсь понять, как работает requirejs и я считаю, что я внимательно следил за документами и другими учебниками. Но, похоже, я не могу загрузить определенный module, например, router.

Это модель представления, где у меня есть проблема,

// File: js/view/list.js

define([
    'jquery',
    'underscore',
    'backbone',

    'router', // Request router.js

    // Pull in the Collection module.
    'collection/contacts',

    // Load the template
    'text!template/list.html'
], function($, _, Backbone, Router, ProjectCollection, Template){

        console.log(Router); // I have passed the router as Router!
        var router = Router();
        router.initialize();

});

результат,

не определено

list.js (строка 17) TypeError: Маршрутизатор не является функцией

var router = Router();

Это код маршрутизатора в корневом каталоге js,

// File: js/router.js

define([
    'jquery',
    'underscore',
    'backbone',
    'view/list'
], function($, _, Backbone, ProjectListView){

    var AppRouter = Backbone.Router.extend({
        routes: {
            'list_contacts':    'renderListContactsPage'
        },

        renderListContactsPage: function () {
            var projectListView = new ProjectListView();
            projectListView.listContactsPage();
        }
    });

    var initialize = function(){
        var app_router = new AppRouter;
    };

    return {
        initialize: initialize
    };
});

Любые идеи, что я сделал неправильно, и как я могу это исправить?

Другие файлы,

// File: js/main.js
require.config({
    //By default load any module IDs from js/lib
    baseUrl: 'js',
    paths: {
        jquery: 'lib/jquery/jquery-min',
        underscore: 'lib/underscore/underscore-min',
        backbone: 'lib/backbone/backbone-min',
        text: 'lib/text/text'
    },

    shim: {
        jquery: {
          exports: '$'
        },
        underscore: {
          exports: '_'
        },
        backbone: {
          exports: 'Backbone'
        }
      }
});

require([
    // Load our app module and pass it to our definition function
    'app'
], function(App){
    // The "app" dependency is passed in as "App"
    App.initialize();
});

А также,

// File: js/app.js
define([
    'jquery',
    'underscore',
    'backbone',
    'router', // Request router.js
], function($, _, Backbone, Router){

    console.log(Router); // Here no error at all!

    var initialize = function(){

        // Pass in our Router module and call it initialize function
        Router.initialize();
        Backbone.history.start();
    }

    return {
        initialize: initialize
    };
});
  • 1
    Хорошо, у вас есть Router() в js/view/list.js против Router.initialize(); в js/app.js
  • 0
    Я получаю ту же ошибку, даже если я делаю это Router.initialize(); в js/view/list.js
Показать ещё 1 комментарий
Теги:
requirejs
backbone.js

1 ответ

2

В общем случае сообщение об ошибке объясняет все это: возвращаемое значение вашего модуля маршрутизатора (router.js) является литералом объекта, а не функцией, поэтому invoke () на ней приведет к исключению (перегоняется в этом JSFiddle).

Этого достаточно, чтобы изменить вызов:

// (...)
console.log(Router); // I have passed the router as Router!
Router.initialize();

В качестве альтернативы вы можете изменить Router, чтобы фактически вернуть функцию, которая возвращает объект с функцией initialize, вам решать, какое решение более читаемо.

  • 0
    Это должен быть «принятый ответ». @kryger объясняет ситуацию довольно просто.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню