Я все еще пытаюсь понять, как работает 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
};
});
В общем случае сообщение об ошибке объясняет все это: возвращаемое значение вашего модуля маршрутизатора (router.js) является литералом объекта, а не функцией, поэтому invoke ()
на ней приведет к исключению (перегоняется в этом JSFiddle).
Этого достаточно, чтобы изменить вызов:
// (...)
console.log(Router); // I have passed the router as Router!
Router.initialize();
В качестве альтернативы вы можете изменить Router, чтобы фактически вернуть функцию, которая возвращает объект с функцией initialize
, вам решать, какое решение более читаемо.
Router()
вjs/view/list.js
противRouter.initialize();
вjs/app.js
Router.initialize();
вjs/view/list.js