AngularJS | Обработка $ broadcast & $ on для указанного экземпляра того же контроллера c - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть сборка служебного контроллера для управления вложениями документов для повторного использования в моем приложении.

<div ng-controller="someController">
    <div ng-controller="documentController as temp1"></div>
    <div ng-controller="documentController as temp2"></div>
</div>

Под родительским контроллером, т. Е. someController У меня есть метод широковещательной передачи.

var module = angular.module("MyModule");
module.controller("someController",
    function ($scope) {
        $scope.$broadcast("callSomeFunctionInDocumentsController");
    });

module.controller("documentController",
    function($scope) {
        $scope.$on("callSomeFunctionInDocumentsController", function() {
            //do something here
        });
    });

Теперь проблема, с которой я сталкиваюсь, заключается в том, что, поскольку documentController добавляется дважды в представление, метод $ on также выполняется дважды. Принимая во внимание некоторые условия, я бы хотел вызывать метод $ on либо в temp1, либо в temp2 экземпляре, но не в обоих.

Я не уверен, что то, чего я хочу достичь sh, возможно, но любая помощь будет высоко ценится.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Один из подходов заключается в присвоении уникального идентификатора каждому элементу с контроллером:

<div ng-controller="someController">
    <div id="temp1" ng-controller="documentController as temp1"></div>
    <div id="temp2" ng-controller="documentController as temp2"></div>
</div>

Затем используйте локальный $attrs для дифференциации:

app.controller("documentController", function($scope, $attrs) {
    $scope.$on("callSomeFunctionInDocumentsController", function() {
        if ($attrs.id == "temp1") {
           //do something specific to "temp1" controller
        });
    });
})

Для получения дополнительной информации, см.

0 голосов
/ 30 апреля 2020

$broadcast работает просто: каждый зарегистрированный пользователь получает уведомление через $on.

В вашем примере оба контроллера зарегистрированы.

Так зачем вы используете один и тот же контроллер дважды? Возможно, стоит переключиться на компонент ?


А как насчет этого:

<div ng-controller="someController">
    <div ng-controller="documentController as temp1"></div>
    <div ng-if="oneCtrlGotNotification" ng-controller="documentController as temp2"></div>
</div>

, где oneCtrlGotNotification - некоторый флаг (возможно, под $rootScope) .

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

Но это обходной путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...