我正在尝试实现一个使用 jquery、underscore.js 和 backscore.js 通过 require.js 加载的基本测试,由于某种原因,我似乎无法正确排列所有内容。研究表明,其他人没有遇到过同样的问题,所以我知道这一定是我没有看到的简单问题。
我遇到的问题是,当backbone.js 加载时,它找不到对_ 的引用。我发现其他人报告了同样的问题,但问题通常是以错误的顺序将依赖项引用传递给处理程序或其他明显的问题。这发生在主干加载时。
我还看到了许多“机械”解决方案,例如“将所有内容放在同一个文件中”,并通过按正确顺序包含多个脚本以传统方式加载它们,但我真的很想让它工作,因为它似乎是一种强大的方法。
最初我从这里的结构http://backbonetutorials.com/organizing-backbone-using-modules/开始,它在演示中工作,但感觉有点脆弱,因为当我尝试进行非常简单的修改或构建一个简单的示例时地面,它打破。
在我的头撞了太久之后,我回过头来发现这个页面 使用 RequireJS 加载主干和下划线 和另一个简单的例子,我重新获得了希望。然而,在基于它建立一个新的测试之后,我仍然收到同样的问题,即使主干的 0.5.3-optamd 分支应该处理它自己对下划线的依赖。
事不宜迟,这里是超简单的代码,它应该可以工作,但却让我发疯。希望这是我刚刚以某种方式错过的显而易见的事情:
索引.html
<!DOCTYPE html>
<html>
<head>
<title>Backbone.js/Underscore.js via Require.js Learning Page</title>
<script src="js/libs/require/require.js"></script>
<script src="js/main.js"></script>
</head>
<body>
<div>Backbone.js/Underscore.js via Require.js Learning Page</div>
<div class="testhook"></div>
</body>
</html>
js/main.js
require.config({
paths: {
'jquery': 'libs/jquery/1.7/jquery',
'underscore': 'libs/underscore/1.2.2/underscore',
'backbone': 'libs/backbone/0.5.3-optamd/backbone'
},
baseUrl: '/js',
urlArgs: 'v=1.0'
});
require([
'domReady',
'app'
],
function( domReady, App ){
domReady(function(){
console.log( 'Dom is ready' );
App.init();
});
}
);
js/app.js
// Filename: app.js
define([
'jquery',
'underscore',
'backbone'
],
function( $, _, Backbone ){
var init = function(){
console.log( 'app.js > init()' );
// jquery test (WORKS)
$('.testhook').append('testhook append');
// underscore test (WORKS)
console.log( _.map([1, 2, 3], function(n){ return n * 2; }));
// backbone test (DIES)
var artist = new Backbone.Model({
firstName: "Wassily",
lastName: "Kandinsky"
});
artist.set({birthday: "December 16, 1866"});
console.log(JSON.stringify(artist));
}
return { init: init };
}
);
确切的控制台输出是:
Uncaught TypeError: Cannot call method 'extend' of undefined (backbone.js:150)
main.js:18 Dom is ready
app.js:11 app.js > init()
app.js:17 [2, 4, 6]
app.js:20 Uncaught TypeError: Cannot read property 'Model' of null (app.js:20)
NOTE:
Line 150 in unminified backbone.js is:
_.extend(Backbone.Model.prototype, Backbone.Events, {
我在使用 Chrome 17.0.938.0 dev-m 的 Windows 7 机器上。
我的脚本版本是:
backbone: 0.5.3-optand
jquery: 1.7
require: 1.0.1
underscore: 1.2.2
我的目录结构是:
js
+-- libs/
¦ +-- backbone/
¦ ¦ +-- 0.5.3-optamd/
¦ ¦ +-- backbone.js
¦ +-- jquery/
¦ ¦ +-- 1.7/
¦ ¦ +-- jquery.js
¦ +-- require/
¦ ¦ +-- require.js
¦ +-- underscore/
¦ +-- 1.2.2/
¦ +-- underscore.js
+-- app.js
+-- domReady.js
+-- main.js
+-- order.js
index.html
我无法相信这给我带来了多大的困难,我真的希望有人能阐明这里到底发生了什么。