Nano Hash - криптовалюты, майнинг, программирование

В чем разница между $ rootScope и $ rootScope. $ Emit / $ broadcast в AngularJS?

Это структура моей страницы.

// app.html
<wrapper ng-if="initialized && $root.user.type!='guest'">
  <header-component></header-component>
  <div class="app-body">
    <sidebar-component></sidebar-component>
    <main class="main-content" style="height:{{$root.pageHeight}}px; overflow-y: scroll">
      <ng-view></ng-view>
    </main>
    <aside-component></aside-component>
  </div>
</wrapper>

Теперь в директиве ng-view у меня есть контроллер, который должен передавать данные компоненту заголовка. Как видите, ng-view каким-то образом не связан с компонентом заголовка.

Скажем, экран ng-view controll now:

// some-screen.js
$scope.foo = "bar";

И хочу, чтобы в шапке отображалось bar.

Я могу сделать это как с помощью $ rootScope (без каких-либо событий), так и с помощью события $ broadcast.

Первый метод - с использованием $ rootScope - как есть - без чего-либо:

// some-screen.js 
$rootScope.foo = "bar";

// header.js 
app.directive("headerComponent", ($rootScope) => {
  return {
    templateUrl: "/structure/header/header.html",
    scope: {},
    link: function($scope, element, attrs) {
      console.log($rootScope.foo) // "bar"
    }
  }
});

Второй способ - использование события $ broadcast

// some-screen.js 
$rootScope.$emit("SomeNameOfTheEvent", $scope.foo);

// header.js 
app.directive("headerComponent", ($rootScope) => {
  return {
    templateUrl: "/structure/header/header.html",
    scope: {},
    link: function($scope, element, attrs) {
      $rootScope.$on("SomeNameOfTheEvent", function(event, info) {
        console.log(info.foo) // "bar"
      });
    }
  }
});

Теперь обратите внимание на две вещи при использовании события $ broadcast:

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

  2. Они оба делают одно и то же - $ broadcast просто требуется больше кода для работы.

Что мне не хватает, AngularJS, вероятно, для чего-то создал событие $ broadcast.


  • Вы говорите, что придумывать добрые имена - пустая трата времени. Это недальновидный взгляд. Будь то имя события или имя переменной, придумывание правильных имен упрощает понимание, отладку, тестирование и сопровождение кода. Хорошие имена экономят время в течение всего срока службы кода. 04.11.2018

Ответы:


1

$ emit отправляет событие вверх ... $ broadcast отправляет событие вниз

Подробное объяснение

$rootScope.$emit позволяет поймать его только $rootScope слушателям. Это хорошо, когда вы не хотите, чтобы каждый $ scope получил это. В основном общение на высоком уровне. Представьте, что взрослые разговаривают друг с другом в комнате, чтобы дети их не слышали.

$rootScope.$broadcast - это метод, позволяющий услышать это практически всем. Это было бы то же самое, если бы родители кричали, что ужин готов, чтобы все в доме его слышали.

$scope.$emit - это когда вы хотите, чтобы $scope и все его родители и $rootScope услышали о событии. Это ребенок, который скулит своим родителям дома (но не в продуктовом магазине, где другие дети могут слышать).

$scope.$broadcast предназначен для самого $scope и его дочерних элементов. Это ребенок, который шепчет своим мягким игрушкам, чтобы их родители не слышали.

04.11.2018
  • Я спрашиваю о привязке данных напрямую через $rootScope, а не о литье с помощью $emit или $broadcast. 04.11.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..