我刚刚开始使用 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() { ... }
}
我看到的是,knockout-1.2.1.js 在 jquery-tmpl.js 之前被加载和评估。console.log
s 显示init tmpl
发生在 之前,init ko
因此 RequireJS 回调以正确的顺序触发。但是,我在 Knockout 中添加了一些调试日志,我可以看到它在init tmpl
发生之前得到了评估。
结果,当我尝试时ko.applyBindings()
,它抱怨找不到 jQuery 模板。有趣的是,如果我手动告诉 KO 在回调中注册默认模板引擎,它工作正常,一切都很完美。但是,我认为这只是掩盖了核心问题。
为什么 RequireJS 在评估 Knockout 之前不等到 jquery-tmpl 被加载?