Привязка свойства Angular Directive к родительскому контроллеру

В директиве ma-resource-text-watch я вызываю api для получения списка текстов ресурсов. Я хочу иметь возможность скрыть компонент предупреждения, если api не возвращает тексты ресурсов. Кто-нибудь знает, как я могу это сделать?

<div ng-controller = "IntroductionCntrl" class = "hidden-print">
    <div class = "container-fluid" ng-if = "introductionResourceKey">
        <alert-component type = "guidance">
            <span ma-resource-text-watch = "{{introductionResourceKey}}"></span>
        </alert-component>
    </div>
</div>
ng-if = "texts.length"? Или ng-if = "dataIsLoaded && texts.length"?
Frank Modica 29.11.2018 17:16

@FrankModica, как и где мне объявить dataIsLoaded? Или как мне получить доступ к texts.length, если texts объявлен в директиве как локальная переменная?

Rob 29.11.2018 17:20

Извините, я не понял структуру родитель-потомок. Похоже, что директива может принимать обратный вызов, который запускается при загрузке данных. Он может передавать текст (или только длину) этому обратному вызову. Тогда родитель будет знать, когда данные загружены и количество текстов.

Frank Modica 29.11.2018 17:23

@FrankModica Я только что посмотрел, и мне кажется, что это именно то, что я пытаюсь сделать! Вы хотите написать в качестве ответа, чтобы я мог дать вам интернет-очки?

Rob 29.11.2018 17:27

Я перешел на ng-show, потому что, если мы будем использовать ng-if, директива вообще не будет создана. Возможно, вы захотите подумать о том, чтобы родительский контроллер выполнял вызовы API, но я не уверен, имеет ли это смысл в вашем случае.

Frank Modica 29.11.2018 17:44
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Директивы позволяют расширять HTML новыми элементами и атрибутами и даже создавать собственные структурные директивы для манипулирования DOM. С...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
0
5
13
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете включить в свою директиву обратный вызов (или выражение), который будет запускаться при загрузке данных. Например, в определении директивы свойство scope может иметь:

scope: {
  onTextsLoaded: '&'
}

Затем директива может вызывать:

scope.onTextsLoaded({ texts: yourTexts })

И родительский контроллер может передать выражение в качестве обратного вызова и использовать ng-show, чтобы скрыть alert-component:

<alert-component ng-show = "dataIsLoaded && texts.length">
    <span ma-resource-text-watch = "{{introductionResourceKey}}" on-texts-loaded = "onTextsLoaded(texts)"></span>
</alert-component>

С функцией, определенной как:

$scope.onTextsLoaded = function(texts) {
    $scope.dataIsLoaded = true;
    $scope.texts = texts;
}

Другие вопросы по теме