gpt4 book ai didi

javascript - 来自服务的 $emit 或 $broadcast 事件并在一个(或多个) Controller 中监听它们

转载 作者:行者123 更新时间:2023-12-02 16:20:50 25 4
gpt4 key购买 nike

我编写了一个简单的示例,我想从服务发出/广播一个事件,并且希望 Controller 监听该事件并更改 UI,但我无法使其工作并调试代码似乎在监听器中停止,但它不执行该函数。

http://plnkr.co/edit/eglcq7zELLfKp86DYzOe?p=preview

服务:

angular.module('ServiceModule', []).
service('servicetest', ['$rootScope', function($rootScope){
this.test = function(){
$rootScope.$emit('testevent');
};
}]);

Controller

angular.module('ControllerModule', ['ServiceModule']).
controller('ControllerTest', ['$scope','$rootScope','servicetest', function($scope, $rootScope, servicetest){
$scope.name = 'World';
servicetest.test();
$rootScope.$on('testevent', function(){
$scope.name = 'Joe';
});
}]);

索引

<!DOCTYPE html>
<html ng-app="ControllerModule">

<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<script data-require="angular.js@1.2.x" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js" data-semver="1.2.16"></script>
<script src="controller.js"></script>
<script src="service.js"></script>
</head>

<body ng-controller="ControllerTest">
<p>Hello {{name}}!</p>
</body>

</html>

解决方案:

正如 ivarni 或 Walter Brand 所报告的那样,对触发事件的服务函数的调用必须放在监听器之后,否则您将触发一个还没有监听器能够监听的事件。

我们只需按如下方式更改 Controller :

服务

angular.module('ControllerModule', ['ServiceModule']).
controller('ControllerTest', ['$scope','$rootScope','servicetest', function($scope, $rootScope, servicetest){
$scope.name = 'World';
$rootScope.$on('testevent', function(){
$scope.name = 'Joe';
});
servicetest.test();
}]);

最佳答案

您在附加监听器之前触发了该事件。

试试这个:

  $rootScope.$on('testevent', function(){
$scope.name = 'Joe';
});
servicetest.test();

关于javascript - 来自服务的 $emit 或 $broadcast 事件并在一个(或多个) Controller 中监听它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23013883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com