Я только начинаю работать с 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");
}
);
My 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 не ждет, пока загрузится jquery-tmpl, прежде чем оценивать Knockout?