requirejs загружает шаблон модуля асинхронных шаблонов

Я просто решил попробовать require.js в первый раз, и по большей части он работает нормально, пока я не дойду до точки, где я пытаюсь динамически обрабатывать загрузку шаблона.

в основном, у меня есть требование, чтобы приложение не запускалось, пока все шаблоны не будут загружены и не станут доступными.

для этого был создан модуль «шаблоны». он импортирует определение массива шаблонов (уже доступных), которые необходимо загрузить (требуется) перед возвратом.

Я почти уверен, что это, вероятно, анти-шаблон, так как бы вы его исправили?

app -> requires "templating"
    define templating ->
        - loop through an array of templates and dynamically create a list
        - define all templates (via text!) so later we can require("template-name")
        - also tried, require all templates 

Я наблюдаю, что модуль шаблонов загружается и становится доступным для приложения до загрузки всех шаблонов.

Затем следует XHR, извлекающий шаблоны.

Как предотвратить возврат модуля до того, как все тексты загрузятся и скомпилируются? псевдокод или ссылки на примеры подойдут.


person Dimitar Christoff    schedule 13.04.2012    source источник


Ответы (1)


На самом деле у нас было одно решение в начале проекта, а затем мы перешли к другому.

[1] Синхронизация. Поскольку мы используем jQuery в нашем приложении, у нас есть объект jQuery Deferred, доступный для использования во всем приложении. Я создал один экземпляр Deferred, у которого .resolved() вызывался только тогда, когда все мои шаблоны были загружены. Затем каждый раз, когда я пытался использовать шаблон, я заворачивал его в такой код:

$.when(cache.templatesLoadedPromise).done(
  function () {
    // Render the view.
    $("...").html($.tmpl(cache.template, jsonData));
  });

Тогда ни один из рендеров не произойдет, пока шаблоны не будут доступны.

[2] Загрузка и регистрация по модулям. Никто не был в восторге от решения [1], и мы хотели, чтобы каждый модуль загружал только шаблоны, необходимые для этого конкретного модуля. Итак, мы начали просто перечислять их как требования «text!something.tmpl», а затем регистрировать этот конкретный шаблон в качестве первой строки в модуле, для которого это было требованием. В нашем случае мы используем Handlebars в качестве механизма шаблонов вместе с ICanHandlebarz (по аналогии с ICanHaz для усов). Итак, у меня есть вызов ich.addTemplate("что-то", что-то); в начале кода модуля.

В некоторых случаях несколько модулей использовали одни и те же шаблоны, поэтому мне приходилось проверять, был ли шаблон уже зарегистрирован, прежде чем выполнять регистрацию.

Я надеюсь, что один из них поможет вам с вашей проблемой.

person John Munsch    schedule 13.04.2012
comment
ура, это помогает. все мои шаблоны связаны с представлениями, и я действительно могу разгрузить их на концах представления/модели... в любом случае еще не решил. - person Dimitar Christoff; 13.04.2012