AngularJS - Кілька ng-переглядів в одному шаблоні


132

Я будую динамічний веб-додаток за допомогою AngularJS. Чи можливо мати декілька ng-viewв одному шаблоні?


2
Здається, є запит на витяг, все ще з деякими помилками: github.com/angular/angular.js/pull/1198
— Alp

4
Ян Варвіг пише про роль директив в Angular. Це не відповідь на ваше запитання, але в деяких випадках його ідеї можуть бути хорошою альтернативою: jan.varwig.org/archive/angularjs-views-vs-directives/…
— Juha Palomäki

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

Відповіді:


100

Ви можете мати лише один ng-view.

Ви можете змінити його зміст декількох способів: ng-include, ng-switchабо вiдтворення різних контролерів та шаблони через routeProvider.


1
відображення контролерів і шаблонів замінить весь елемент ng-перегляду, правда?
— zx1986

9
А як щодо динамічної зміни вмісту віджета? Не хочете ви створити подання для віджета та контролер для віджета та модель для віджета?
— Рей Суельцер

Чи рекомендується використовувати представлення даних? Хіба не краще визначати діви за допомогою ng-showта ng-hideі контролювати їх видимість за допомогою змінних? Тому що іноді я хотів би приховати / показати декілька компонентів
— SomethingSomething

39

UI-Router - це проект, який може допомогти: https://github.com/angular-ui/ui-router Однією з його функцій є декілька іменованих переглядів

UI-Router має багато функцій, і я рекомендую використовувати його, якщо ви працюєте над розширеним додатком.

Перевірте документацію декількох іменованих видів тут .


6
На жаль, як говорить readme ui-router: Примітка: UI-роутер знаходиться в активному розвитку. Таким чином, хоча ця бібліотека добре перевірена, API може змінюватися. Подумайте про використання його у виробничих програмах лише у тому випадку, якщо вам зручно дотримуватися журналу змін та відповідно оновити використання.
— траїноз

1
@trainoasis Використовував його для декількох проектів, здається, "дуже" стабільним і до цих пір у мене не було проблем щодо зміни API, адже я не пам'ятаю жодних великих змін в API.
— Morteza Ziyae

19

Я вірю, що ви можете досягти цього, просто отримавши одиноку ng-view. У головному шаблоні ви можете мати ng-includeрозділи для поданих подань, тоді в головному контролері визначайте властивості моделі для кожного під шаблону. Так що вони автоматично прив’язуються до ng-includeсекцій. Це те саме, що мати кількаng-view

Ви можете перевірити приклад, наведений у ng-include документації

у прикладі, коли ви змінюєте шаблон із випадаючого списку, він змінює вміст. Тут припустимо, що у вас є одне головне, ng-viewі замість того, щоб вручну вибирати допоміжний вміст, вибираючи спадне меню, ви робите це так, як завантажується основний вигляд.


2
За відсутності такого рішення, як UI-маршрутизатор, ng-include є дійсно життєздатною альтернативою, як ви пояснили. Те, що ng-include не може досягти, - це кілька переглядів, керованих URL-адресами (станом), $ route не може динамічно відображати різні види на основі поточної URL-адреси. Ми могли б скрутити руки Angular і зробити це можливим, використовуючи власну логіку в контролері, як, наприклад, в ng-include документації , але це не бажано шаблону архітектури додатків, UI-Router - це правильний тип рішення.
— Yiling

Один плюс для коментаря @Yiling. Використання ng-include є вирішенням проблеми.
— Фаршид Сабері

13

Використовуючи звичайний ng-viewмодуль, ви не можете мати більше одного динамічного шаблону.

Однак цей проект дозволяє вам це зробити (шукайте ui-router).


3
angular-ui здається хорошим вибором у (найближчому) майбутньому, але він все ще здається дуже нестабільним для використання у виробництві
— David Barreto

8

Можливо мати кілька або вкладені представлення даних. Але не за допомогою ng-view.

Первинний модуль маршрутизації в кутовій формі не підтримує декілька видів. Але ви можете використовувати ui-роутер. Це сторонній модуль, який можна отримати за допомогою Github, angular-ui / ui-router, https://github.com/angular-ui/ui-router . Також наразі розробляється нова версія ngRouter (ngNewRouter). На даний момент це не стабільно. Тому я пропоную вам простий приклад запуску з ui-роутером. Використовуючи його, ви можете називати представлення даних та вказувати, які шаблони та контролери слід використовувати для їх надання. Використовуючи $ stateProvider, ви повинні вказати, як повинні бути надані заставки для певного стану.

<body ng-app="main">
    <script type="text/javascript">
    angular.module('main', ['ui.router'])
    .config(['$locationProvider', '$stateProvider', function ($locationProvider, $stateProvider) {
        $stateProvider
        .state('home', {
            url: '/',
            views: {
                'header': {
                    templateUrl: '/app/header.html'
                },
                'content': {
                    templateUrl: '/app/content.html'
                }
            }
        });
    }]);
    </script>
    <a ui-sref="home">home</a>
    <div ui-view="header">header</div>
    <div ui-view="content">content</div>
    <div ui-view="bottom">footer</div>
    <script src="bower_components/angular/angular.js"></script>
    <script src="bower_components/angular-ui-router/release/angular-ui-router.js">
</body>

Для цього зразка вам потрібно посилатись на angularjs та angular-ui.router.

$ bower install angular-ui-router

Дякую, Фаршид, це чудово! Це слід згадати у кутовому сховищі Github github.com/angular-ui/ui-router, де я отримав модуль
— totaltotallyamazing

Я не впевнений, навіщо вам це потрібно робити. Чому б не включити ng-заголовок / колонтитул та ng-перегляд вмісту?
— користувач441521

ng-include буде працювати, якщо розміщуються файли, наприклад, на nodejs. Якщо працювати з локальним каталогом, це призведе до помилки між доменом.
— Сід

0

Ви не можете мати кілька ng-перегляду. Нижче наводиться випадок мого використання, коли я вирішив свою вимогу. Мені хотілося, щоб поведінка на вкладках була в діалозі моєї моделі Я зіткнувся з проблемою, як натискання на вкладки з гіперпосиланням, яке буде викликати посилання маршрутизатора. Я вирішив це за допомогою кнопки та css для вкладок. Коли користувач натискає на вкладку, він насправді не викликає гіперпосилання, яке завжди викликатиме ng-роутер. Коли користувач натискає на вкладку, він викличе метод, де я динамічно завантажую html. Нижче наведена функція при натисканні на вкладку

self.submit = function(form) {
                $templateRequest('resources/items/employee/test_template.html').then(function(template){
                var compiledeHTML = $compile(template)($scope);
                $("#d").replaceWith(compiledeHTML);
});

Користувач $ templateRequest. На сторінку test_template.html додайте вміст html. Цей вміст html буде прив’язаний до вашого контролера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.