Angular с использованием шаблонов templateUrl или HTML

Я изо всех сил пытался найти какую-либо информацию об этом в Интернете, так что вот:

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

В моем текущем подходе используется подход $routeProvider с templateUrl для каждого представления, что приводит к выборке нескольких файлов .html на разных этапах. На мой взгляд, это создает ненужную нагрузку на веб-сервер.

Есть ли другой вариант включения полного содержимого в один запрос, который соответствует лучшим практикам angular?

Моя текущая лучшая идея - включить все шаблоны в индексный файл и использовать ng-if для отображения только текущего соответствующего представления.


person Jervelund    schedule 07.03.2015    source источник


Ответы (2)


Возможно, стоит взглянуть на $templateCache, который можно внедрить в TemplateService (такой как ниже); задача службы заключается в загрузке любых переданных ей файлов. Вы можете внедрить службу в контроллер верхнего уровня и кэшировать любые файлы, которые могут вам понадобиться позже:

Основной Ctrl

app.controller('MyMainCtrl', ['TemplateService', function(TemplateService) {
    /* Specify templates to be loaded */
    var templates = [ '/foo.html', '/bar.html' ];

    /* Fetch and cache each template */
    _.each(templates, function(template) {
       TemplateService.loadTemplate(template)
           .done(function() {
                console.log('Loaded template: ' + template);
           });
    });
}]);

Служба шаблонов

app.service('TemplateService', ['$templateCache', function ($templateCache) {
    return {
        loadTemplate: function(template) {
            var deferred = new $.Deferred();

            /* Check if the template is already been loaded */
            if ($templateCache.get(template)) {
                deferred.resolve();
            } else {
                var options = {
                    async: false,
                    type: 'GET',
                    url: template
                };
                /* Fetch template */
                $.ajax(options)
                    .done(function (response) {
                        $templateCache.put(template, response);
                        deferred.resolve();
                    })
                    .fail(function () {
                        console.log('Unable to load template: ' + template);
                        deferred.reject();
                    });
            }
            return deferred.promise();
        }
    }
}]);
person lux    schedule 07.03.2015
comment
Вся моя проблема с текущим подходом к выбору html-файла для каждого шаблона заключается в том, что он создает несколько одновременных запросов к веб-серверу. Если я смогу объединить несколько шаблонов в один, я думаю, это значительно улучшит время отклика (поскольку я не использую SPDY). Кэширование частично решает это, но мне было интересно, есть ли другой подход — например, кеширование 8 шаблонов с использованием только 1 запроса. - person Jervelund; 07.03.2015
comment
Использование nginx (или какого-либо другого асинхронного сервера) для обслуживания статического контента практически сводит на нет любые опасения по поводу генерации слишком большого количества запросов. Эти файлы являются текстовыми, и нагрузка на сервер будет незначительной. Если бы вы извлекали эти шаблоны из базы данных, это была бы другая история. Кроме того, протокол HTTP утверждает, что 1 запрос приводит к 1 ответу, поэтому, если вы не архивируете шаблоны на сервере, вам нужно будет выполнить N запросов GET, чтобы получить обратно N шаблонов — если только вы не объедините все шаблоны в один HTML-код. файл, а затем как-то разобрать обратно на стороне JS, что было бы слишком грязно - person lux; 08.03.2015
comment
Не могли бы вы уточнить, почему объединение всех шаблонов в один HTML-файл было бы слишком беспорядочным? Во время разработки они могут быть отдельными файлами — при производстве они объединяются с использованием метода тега скрипта из документов. angularjs.org/api/ng/service/$templateCache. ‹script type=text/ng-template id=template1.html›template1‹/script›‹script type=text/ng-template id=template2.html›template2‹/script› - person Jervelund; 08.03.2015
comment
Если подумать, все шаблоны можно завернуть в json и сохранить в кеше с помощью $templateCache.put. - person Jervelund; 08.03.2015
comment
Если у вас есть отдельные файлы (template1.html, template2.html и т. д.), вам нужно будет получать их с сервера по отдельности, и это невозможно обойти, если вы, конечно, не заархивируете, поэтому независимо от того, куда вы поместите теги script (связанные на одной странице или нет), каждый из них всегда будет приводить к одному GET на сервер. - person lux; 08.03.2015
comment
Спасибо за ваш вклад - person Jervelund; 08.03.2015

Это совершенно законный способ сделать это, потому что провайдер маршрута должен обрабатывать, что и когда загружать. Когда вы вводите новый маршрут, angular уничтожит старый и загрузит новый, поэтому не все ваши шаблоны находятся в DOM одновременно, то же самое происходит с ng-if.

Если вы чувствуете, что ваше приложение будет очень большим и включает в себя массу представлений, вы можете изучить ленивую загрузку с помощью angular и что-то вроде Requirejs. Если вы пойдете по этому пути, я бы подождал несколько недель до Angular 1.4 и нового маршрутизатора, который они выпускают для него.

person RickyRoller    schedule 07.03.2015