Подтвердить что ты не робот

Angular UI-Router: дочерний элемент с родительским представлением

В форме истории:

То, что я ищу здесь, - это настройка мастер-детали. Мастер находится в форме списка, и когда я нажимаю ссылку (относительно конкретной строки/записи (или Учетная запись в этом случае)), я хочу видеть детали в главном представлении (буквально, "основной" вид: <div class="container" ui-view="main"></div>).

Я хочу сделать это и сохранить свою структуру URL-адресов (/accounts для списка учетных записей; /accounts/:id для подробной версии) , но я хочу, чтобы представление детали использовало представление, в котором использовался список.

В настоящее время у меня

index.html

...
<div class="container" ui-view="main"></div>
...

accounts.js

$stateProvider
    .state ('accounts', {
        url: '/accounts',
        views: {
            'main': {
                controller: 'AccountsCtrl',
                templateUrl: 'accounts/accounts.tpl.html'
            }
        },
        data: { pageTitle: 'Account' }
    })
    .state ('accounts.detail', {
        url: '/:id',
        views: {
            'main': {
                controller: 'AccountDetailCtrl',
                templateUrl: 'accounts/detail.tpl.html'
            }
        },
        data: { pageTitle: 'Account Detail' }
    });

На этом этапе маршрут /accounts работает так, как ожидалось. Он отображает accounts/accounts.tpl.html правильно в представлении main. В этом html каждая строка в ретрансляторе связывает его с соответствующим URL /accounts/:id, с которым я обрабатываю вложенное состояние accounts.detail.

Что очевидно для большинства из вас, кто знает больше, чем я, мой accounts.detail будет отображать представление main , если этот именованный вид существует в шаблоне accounts/accounts.tpl.html, Это действительно так.

Но это не то, что я хочу. Я хочу, чтобы материал accounts.detail отображался в родительском представлении main; Я хочу, чтобы html accounts/detail.tpl.html заменил html accounts/accounts.tpl.html, найденный в index.html: <div class="container" ui-view="main"></div>.

Итак, как я мог это сделать?

МОЕ РЕШЕНИЕ В КОНТЕКСТЕ Трюк заключается в том, что, как говорится в ответе, настроить схему URL для определения того, какое дочернее состояние является "по умолчанию". То, как я интерпретирую этот код на простом английском языке, состоит в том, что родительский класс является абстрактным с правильным URL-адресом, а дочерний класс "по умолчанию" имеет "тот же" URL-адрес (обозначается '').

Если вам нужна дополнительная ясность, просто опубликуйте комментарий, и я поделюсь советами.

.config(function config( $stateProvider ) { $stateProvider
    .state ('accounts', {
        abstract: true,
        url: '/accounts',
        views: {
            'main': {
                templateUrl: 'accounts/accounts.tpl.html',
                controller: 'AccountsCtrl'
            }
        },
        data: { pageTitle: 'Accounts' }
    })
    .state ('accounts.list', {
        url: '',
        views: {
            'main': {
                templateUrl: 'accounts/list.tpl.html',
                controller: 'AccountsListCtrl'
            }
        },
        data: { pageTitle: 'Accounts List' }
    })
    .state ('accounts.detail', {
        url: '/:id',
        views: {
            'main': {
                templateUrl: 'accounts/detail.tpl.html',
                controller: 'AccountDetailCtrl'
            }
        },
        data: { pageTitle: 'Account Detail' }
    });
4b9b3361

Ответ 1

Похоже, вы просто не хотите, чтобы представления были иерархическими. Для этого просто измените имя второго состояния на detail.

Обратите внимание, что при этом вы потеряете любые иерархические свойства дерева состояний (например, состояние кода контроллера).

Если вы хотите, чтобы контроллеры были иерархическими, но заменили html, я бы создал другого родителя выше других, который заботится о логике контроллера, но имеет исключительно простой вид <div ui-view=""></div>.

Например:

$stateProvider
    .state('app', { url: '', abstract: true, template: 'parent.html', controller: 'ParentCtrl' })
    .state('app.accounts', { url: '/accounts', templateUrl: 'accounts.tpl.html', controller: 'AccountsCtrl' })
    .state('app.detail', { url: '/accounts/:id', templateUrl: 'detail.tpl.html', controller: 'AccountDetailCtrl' });

Ответ 2

Вы можете использовать '@', чтобы определить абсолютный путь к u-view по вашему выбору. Например: "detail @contacts": {}, где это абсолютно нацелено на представление "подробно" в состоянии "контакты". в contacts.html

Источник: https://github.com/angular-ui/ui-router/wiki/Multiple-Named-Views