Как проверить, находится ли мой контроллер AngularJS внутри формы

У меня есть контроллер, который я повторно использую в двух разных местах, но я хочу, чтобы контроллер мог различать, используется ли он на странице, которая редактирует данные, или на странице, которая просто отображает данные. Разница здесь в том, что на одной странице контроллер расположен внутри <... ng-form="someForm"> тег.

(На самом деле, это частичный HTML-файл, который включается; контроллер находится внутри этого частичного)

Можно ли определить, находится ли контроллер внутри формы? Если так, то как?

2 ответа

Решение

Я узнал, что мог бы создать директиву, которая необязательно требует form (не ng-form) и что вы можете проверить, присутствует ли он в функции ссылки.

someAngularModule
    .directive('formAware', [function(){
        return {
            require: '^?form',
            template: ' <div>{{isPartOfForm ? "Inside the form" : "Outside of the form"}}</div>',
            link: function(scope, element, attrs, formCtrl) {
                scope.isPartOfForm = (formCtrl !== null);
            }
        }
    }]);

Директива может быть размещена внутри ng-формы (с отображением текста "Внутри формы"):

<div ng-form="myForm">
    <div form-aware></div>
<div>

или без ng-формы (отображается текст "За пределами формы"):

<div>
    <div form-aware></div>
<div>

Я не смог найти какой-либо быстрый способ выполнить ваше требование, но одну вещь, которую вы можете сделать, это определить переменную в $rootScope для отслеживания поведения контроллера. Каждый раз, когда представление загружается с контроллером, оно вызывает свою функцию define в файле javascript.

Таким образом, идея в том, что в $rootScope вы будете определять флаг, загружен ваш требуемый контроллер или нет. Затем вы можете проверить флаг, чтобы узнать, загружен он или нет. Также вы можете использовать $ watch на флаге, чтобы получить уведомление, когда он был загружен. Дайте мне знать, если какая-то часть неясна.

Благодарю.

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