Что не так с моей цепочкой зависимостей RequireJS? - PullRequest
2 голосов
/ 27 октября 2011

Я только начинаю работать с 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?

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Я не смог диагностировать реальную проблему, но мои зависимости работали, используя 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');
        });
  }
);

My 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 не работает правильно с моими исходными определениями.

0 голосов
/ 27 октября 2011

У вас есть файл order.js в каталоге scripts?

Кроме того, сайт requirejs предлагает использовать require-jquery.js вместо require.js, когда вы такжехочу включить jquery.Я всегда использовал это без проблем.

...