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

Angular ui-router: ui-views против директив?

angular ui-router позволяет несколько вложенных представлений. Роль этих взаимозаменяемых взглядов, похоже, перекрывает роль директив.

Каковы преимущества/недостатки использования (нескольких, вложенных) ui-view s vs angular директив?

UPDATE

Состояния и маршрутизация - это две разные функции. Штаты позволяют вам заменять шаблоны partial.html и их контроллеры, и вы можете (необязательно?) указать соответствующий URL/маршрут.

В ответе от Тима Киндберга (a ui-router dev):

ui-view - это директива, поэтому, если вы ее используете, вы используете директиву который работал над тем, чтобы хорошо работать с остальными ui-router. Я не могу себе представить, что легко сворачивать свои собственные чтобы заменить эту функциональность.

И для этого, похоже, у вас может быть 2 варианта:

Нормальные директивы:

app.directive('myDir1', {/*  controller: ... */})
   .directive('myDir2', {/*  controller: ... */}) 

vs ui-view "Директивы"

$stateProvider.state('route1', {
     /*  url: "/route1", // optional?? */
      views: {
        "myDir1": { templateUrl: "myDir1.html" /* , controller: ... */ },
        "myDir2": { templateUrl: "myDir2.html" /* , controller: ... */ }
      }
    })

Бонусный вопрос:

Доступны ли представления нормальные angular функции директивы? Например:

  • Transclude
  • Заменить
  • Изолировать область охвата
  • Функции компиляции/связывания

Если ui-views ARE директивы, кажется, что их использование отличается. Не имеет смысла согласовывать эти модели?

4b9b3361

Ответ 1

Как насчет того, используете ли вы встроенные представления Angular UI router для указания директив?

Скажем, у вас есть директива для таблицы, которая обрабатывает операции CRUD в учетных записях пользователей. Мы скажем, что директива называется user-admin. Наш файл маршрутов будет выглядеть так:

.state('users', {
  url: '/users',
  template: "<user-admin>"
});

Это даст вам много приятных вещей:

  • Позволяет иметь URL-адрес, указывающий прямо на директиву
  • Удаляет дублирование необходимости использования двух шаблонов (шаблон представления и шаблон директивы), когда состояние является только директивой
  • Позволяет начать перемещение логики контроллера в директивы в prep для Angular 2.0. См. здесь и здесь.

Ответ 2

После некоторого размышления/переписки, здесь мой вывод:

ui-views определяют контейнеры, а состояния определяют, что происходит в этих контейнерах

Когда вы кладете директиву ui-view='containerName' на элемент, вы создаете контейнер, который что-то держит. Вы еще ничего не сказали о том, что там происходит.

Когда вы создаете определения $stateProvider.state(...), вы указываете, что происходит в этих контейнерах:

$stateProvider.state('someState', {
  views: {
    "containerName": { templateUrl: "someContents.html" /* , controller: ... */ },
    "container2": { templateUrl: "otherContents.html" /* , controller: ... */ }
  }
})

Можете ли вы использовать все традиционные функции директивы (трансключить, заменить, изолировать область охвата, компилировать/связывать функции) с помощью ui-views? Я не уверен. Например:

$stateProvider.state('someState', {
  views: {
    "containerName": { 
              templateUrl: "someContents.html",
              scope: { localVar: "@" },  // can you
              transclude: true,          // do this?
              controller: function(){}
    },
    "container2": { templateUrl: "otherContents.html" /* , controller: ... */ }
  }
})

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

Ответ 3

Кажется, вы можете сделать что-то подобное с относительной безнаказанностью:

    $stateProvider.state('general', {
        url: '/general',
        views: {
            main: {
                template: '<general-directive></general-directive>'
            }
        }
    });

Ответ 4

**In Config function:**
.state('list', {
            url:'/list',
            template:'<user-info-table></user-info-table>',
            controller:'UserInfoTableController',
        });

**In Directive:**
angular.module('UserInfo').directive("userInfoTable", function() {
    return {
       templateUrl:'templates/UserInfoTable.html',
       restrict:'EA',
    };
});