Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 控制器生命周期和发射/广播_Javascript_Angularjs - Fatal编程技术网

Javascript 控制器生命周期和发射/广播

Javascript 控制器生命周期和发射/广播,javascript,angularjs,Javascript,Angularjs,在我的页面上,我有一个网格,列出了web服务返回的所有文章。用户可以转到单独的页面添加新文章,完成后,该文章应添加到另一页面的网格中。因此,当用户返回到该页面时,文章将被列出 我有一个服务处理两个控制器之间的通信(一个用于网格,一个用于添加文章)。此服务有一个由AddArticleController调用的函数,该函数向my GridController广播消息: function addNewArticle(articleNumber) { $rootScope.$emit('newA

在我的页面上,我有一个网格,列出了web服务返回的所有文章。用户可以转到单独的页面添加新文章,完成后,该文章应添加到另一页面的网格中。因此,当用户返回到该页面时,文章将被列出

我有一个服务处理两个控制器之间的通信(一个用于网格,一个用于添加文章)。此服务有一个由AddArticleController调用的函数,该函数向my GridController广播消息:

function addNewArticle(articleNumber) {
    $rootScope.$emit('newArticleAdded', {
      articleNumber: articleNumber
    });
}
gridController将拾取以下内容:

$rootScope.$on('newArticleAdded', function(event, data) {
          // get all article details generated by the back-end and add it to he grid
        });
问题是,当带有网格的页面已经显示多次时,文章会多次添加到网格中。我认为这是因为每次创建一个新的控制器时,旧的控制器并没有被破坏,所以广播会被多次拾取


我如何解决这个问题?显然,广播只应处理一次。

承认我说这话是出于无知;让服务维护物品清单并让管理员观察是否更容易?它将避免通过作用域来回发送消息,并且有一个单一的真相来源。

服务

myApp.service('myService',function($controller){
 this.broadcastEvent = function(){
  scope = $scope.$new(); 
      $controller('mainCtrl',{
        $scope:scope
      });
     scope.broadCastMethod();
 }

});
控制器

myApp.controller('mainCtrl',function($scope){
 $scope.broadCastMethod = function(){
  $scope.$broadcast("callBraodcast");
 }

})

使用$scope.$emit和$scope.$on,这样它就不会一次又一次地注册广播事件。你不能在服务中注入$scope…然后你可以使用$controller服务通过controllerI调用$broadcast。我真的不明白这一点。你能提供一个例子吗?我不明白…是的,服务部门实际上持有这份名单。然而,gridController上的其他函数也应该被调用;仅仅添加文章是不够的。是否可以获取gridController代码/html的其余部分?为什么从mainCtrl调用broadcast?因为如果从$scope调用$broadcast表单$scope,它将在视图更改时被销毁,而$on不会被多次调用