#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.