我刚开始使用RequireJS,看起来我没有正确表达我的依赖关系。我正试图绘制一个相当简单的依赖链:
KnockoutJS
取决于jquery-tmpl
取决于jquery
我正在尝试不使用require-jquery
。在我的HTML中,我这样做:
<script data-main="scripts/main" src="scripts/require.js"></script>
我的main.js
:
require(
{
baseUrl: 'scripts',
paths: {
jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min',
jquerytmpl: "require-jquery-tmpl",
knockout: "require-knockout"
}
},
["myApp"],
function() {
$(function() {
console.log('main: triggered');
});
}
);
我的require-jquery-tmpl.js
:
define([
"order!jquery",
"order!http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.js"],
function() {
console.log("init tmpl");
}
);
我的require-knockout.js
:
define([
"order!jquerytmpl",
"order!./scripts/knockout-1.2.1.js"],
function() {
console.log("init ko");
}
);
最后,myApp.js
:
define(["knockout"], function() {
$(function() { ... }
}
我所看到的是,在jquery-tmpl.js之前,knockout-1.2.1.js正在加载和评估。 console.log
显示init tmpl
发生在init ko
之前,因此RequireJS回调按正确的顺序触发。但是,我在Knockout中添加了一些调试日志,我可以看到它在init tmpl
发生之前就已经过评估了。
因此,当我尝试ko.applyBindings()
时,它抱怨无法找到jQuery模板。有趣的是,如果我手动告诉KO在回调中注册默认模板引擎,它工作正常,一切都很完美。但是,我认为这只是掩盖核心问题。
为什么RequireJS在评估Knockout之前没有加载jquery-tmpl?
答案 0 :(得分:3)
我无法诊断实际问题,但我在部分模块定义中使用require
而不是define
来使我的依赖项工作。适合我的配置如下所示:
我的main.js
:
require(
{
baseUrl: 'scripts',
paths: {
jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min',
jquerytmpl: "require-jquery-tmpl",
knockout: "require-knockout"
}
},
["myApp"],
function() {
$(function() {
console.log('main: triggered');
});
}
);
我的require-jquery-tmpl.js
:
define(["jquery"], function() {
require(["order!http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.js"], function() {
console.log("init tmpl");
});
});
注意我说的是require
jquery.tmpl.js和order
,而不是将它列在define
依赖项中。
require-knockout.js
的相同更改:
define(["jquerytmpl"], function() {
require(["order!knockout-1.2.1.js"], function() {
console.log("init ko");
});
});
此修复了我的问题,但我仍然没有解释为什么RequreJs
order
插件无法正常使用原始定义。
答案 1 :(得分:0)
您的order.js
目录中是否有scripts
文件?
此外,当您还想要包含jquery时,requirejs站点suggests使用require-jquery.js而不是require.js。我总是毫无问题地使用它。