Angular Js newbie - ссылка в виде контроллера, запускающая другое действие контроллера
Угловой новичок здесь.
Допустим, у меня есть приложение, которое должно отслеживать разные вещи, такие как "отправленные новости", "попытки входа" и так далее. Мой mainController, ответственный за получение информации об этих операциях, получение этих данных из службы и отображение этой информации на простой панели инструментов.
<div ng-controller='mainController'>
+ ---------------------+
| NEWS Submitted: 1233 |
| Login attempts: 233 |
+ ---------------------+
</div>
<div ng-controller='newsController'></div>
<div ng-controller='loginAttemptsController'></div>
Я бы хотел, чтобы номера данных были кликабельными, и, нажимая на них, я бы хотел, чтобы приложение (без изменения маршрута) отображало в относительном блоке детали данных, по которым щелкали. Так, например, новости, представленные в списке или детали попыток входа в систему. Я хотел бы, чтобы обработка деталей представленных новостей и попыток входа осуществлялась в их собственном контроллере.
Проблема заключается в следующем: как я могу создать событие ng-click, которое сообщает angular вызвать конкретную функцию другого контроллера?
2 ответа
Вот как это будет работать -
из вашего mainController отправьте событие вверх (через $emit). Call to $emit отправляет имя события вверх по иерархии области, уведомляя зарегистрированных слушателей $rootScope.Scope.
Внутри newsController и loginAttemptsController добавьте прослушиватель событий (используя $ rootScope. $ On) для прослушивания события, испускаемого из mainController, получите данные из целевой области (в вашем случае это область видимости mainController) и установите для нее модель области видимости newsController и loginAttemptsController.
подробности смотрите в угловой документации - https://docs.angularjs.org/api/ng/type/$rootScope.Scope
Я настроил здесь планку - http://plnkr.co/edit/1dhdPfmB1WwAkYhsz4Hv
Пример кода (шаблон HTML):
<div ng-controller="mainController">
<button data-ng-click="OnNewButtonClick()">Show News</button>
<button data-ng-click="OnLoginAttemptButtonClick()">Show Login Attempts</button>
</div>
<div ng-controller="newsController">
{{newsControllerData.News}}
</div>
<div ng-controller="loginAttemptsController">
{{loginAttemptsControllerData.loginAttempts}}
</div>
Пример кода (основной контроллер):
app.controller("mainController", ["$rootScope", "$scope", function ($rootScope, $scope) {
$scope.newsControllerData = {};
$scope.loginAttemptsControllerData = {};
// from mainController emit HandleNews upwards on the scope
$scope.OnNewButtonClick = function () {
$scope.newsControllerData.info = "Hello World";
$scope.$emit("HandleNews");
}
// from mainController emit HandleLoginAttempts upwards on the scope
$scope.OnLoginAttemptButtonClick = function () {
$scope.loginAttemptsControllerData.info = "login count = 4";
$scope.$emit("HandleLoginAttempts");
}
}]);
Пример кода (новостной контроллер):
app.controller("newsController", ["$rootScope", "$scope", function ($rootScope, $scope) {
$scope.newsControllerData = {};
// when any controller calls HandleNews, i would listen
$rootScope.$on("HandleNews", function (evt, next, current) {
$scope.newsControllerData.News = evt.targetScope.newsControllerData.info;
});
}]);
Пример кода (контроллер loginAttempts):
app.controller("loginAttemptsController", ["$rootScope", "$scope", function ($rootScope, $scope) {
$scope.loginAttemptsControllerData = {};
// when any controller calls HandleLoginAttempts, i would listen
$rootScope.$on("HandleLoginAttempts", function (evt, next, current) {
$scope.loginAttemptsControllerData.loginAttempts = evt.targetScope.loginAttemptsControllerData.info;
});
}]);
Вы можете создать сервис, который будет хранить данные между контроллерами. Затем вы можете использовать / изменить этот фрагмент данных как в ваших контроллерах, так и в связанных представлениях.
app.service('newsDataService', function() {
this.newsData = [];
});
тогда в вашем контроллере,
app.controller('newsController', function($scope, 'newsDataService') {
// access the data using newsDataService.newsData.
});
app.controller('loginAttemptsController', function($scope, 'newsDataService') {
// access the data using newsDataService.newsData.
});
Больше информации об услугах AngularJs: https://docs.angularjs.org/guide/services