Данные дочернего контроллера AngularJS не загружаются в пользовательский интерфейс при использовании $emit для обновления родительских данных

#javascript #angularjs #emit #ng-controller

#javascript #angularjs #emit #ng-контроллер

Вопрос:

Я использую AngularJS 1.5 и использую ‘$emit’ для отправки события родительскому контроллеру для обновления данных родительского контроллера. В ‘$ On’ я написал логику для обновления данных родительского контроллера.

Теперь данные родительского контроллера обновляются, но после этого он не может связать данные для дочернего контроллера, с которого был запущен ‘$ emit’.

Я пытался использовать ‘$apply’, но он говорит, что ‘$ digest’ уже выполняется. Я также использую инструмент Batrang для просмотра данных, и он показывает эту страницу со всеми этими данными, но она не отображается в пользовательском интерфейсе.

Кто-нибудь может сказать мне, как заставить angular связать эти данные с элементом управления HTML, который уже доступен на странице.

Я не могу поместить здесь пример кода, потому что это живой проект, и мне придется создать пример проекта, чтобы воспроизвести проблему. Хотя, если будет нелегко ответить на мой запрос без примера кода, я выложу пример кода на Plunker через день.

Ответ №1:

На основе документации Angular существует два метода объявления контроллера в HTML:

методы и свойства привязываются непосредственно к контроллеру с помощью ng-controller="SettingsController1 as settings"

один вводится $scope в контроллер: ng-controller="SettingsController2"

Второй вариант более распространен в сообществе Angular и обычно используется в шаблонах и в этом руководстве. Однако есть преимущества в привязке свойств непосредственно к контроллеру и избежании области видимости.

Использование controller as делает очевидным, к какому контроллеру вы обращаетесь в шаблоне, когда к элементу применяются несколько контроллеров. Если вы пишете свои контроллеры как классы, вам будет проще получить доступ к свойствам и методам, которые будут отображаться в области видимости, изнутри кода контроллера. Поскольку в привязках всегда есть a . , вам не нужно беспокоиться о маскирующих примитивах прототипного наследования.

Таким образом, вы всегда можете ссылаться на родительскую область в дочерней области, используя controller as :

 <div ng-controller="parentController as parent">
    <span>{{parent.title}}</span>
    <div ng-controller="childController as child">
        <span>{{parent.title}}</span>
        <span>{{child.title}}</span>
    </div>
</div>
  

Комментарии:

1. Привет, МарКоСен, спасибо за ваш ответ, но у меня нет никаких проблем с вызовом метода. Я использовал $emit, который работает нормально и обновляет родительские данные, затем я вызываю метод для обновления дочерних данных. несмотря на то, что дочерние данные загружаются в DOM, они не отображаются в пользовательском интерфейсе. итак, мой основной вопрос: как мне отобразить те данные в пользовательском интерфейсе, которые уже доступны в DOM.