检测路由器控制器满载时的变化

问题描述 投票:3回答:2

我有一个问题,广播事件到另一个控制器。所以这里是交易。在网站的页脚中,我加载了另一个控制器(CMSController)。此外,我还有一个路径'/ help',该控制器也在加载并从CMS获取帮助中心数据。页脚中有与此相关的链接。让我们说条款和条件链接。要获取该数据,我需要转到'/ help'路由并调用getHelpPage()函数。这是我正在进行的正在进行的项目结构。所以从页脚我重定向到'/ help'路由并广播一个事件,我正在监听CMSController并调用getHelpPage()

$scope.openHelpCenterPage = function openHelpCenterPage(slug) {
    if($location.path().indexOf('/help') === -1){
        $location.path('/help');
    }
        $rootScope.$broadcast('openHelpCenterPage', {slug: slug, from: 'footer'});
};

并在CMSController中

$rootScope.$on('openHelpCenterPage', function (event, obj) {
        $scope.getHelpPage(obj.slug);
});

问题是这不起作用。我想cMSController没有加载这是怎么回事。控制台中没有错误。

但是....在播放到$ timeout期间解决了问题,即使是0秒..

$timeout(function () {
      $rootScope.$broadcast('openHelpCenterPage', {slug: slug, from: 'footer'});
    },0);

但我不觉得这是一个很好的解决方案。还有其他想法???听完openHelpCenterPage后我也试过听$ routeChangeSuccess,但是再次没有结果....

$rootScope.$on('openHelpCenterPage', function (event, obj) {
    $rootScope.$on('$routeChangeSuccess',function(){
    $scope.getHelpPage(obj.slug);
  })
});

也许是检测控制器是否满载的其他方法????非常感谢你的时间。希望我能很好地解释这个问题。

javascript angularjs
2个回答
0
投票

从我的理解你有2个控制器,当你尝试从一个控制器广播一个事件到第二个控制器它没有正在监听,因为它没有完全加载..为了避免这种情况你可以在加载后从第二个控制器触发事件​​然后继续正常流量看看这个样本。 CTRL2

这将在加载时触发事件

(function() {

    'use strict';

    appName.controller('CMSController', Controller);
    Controller.$inject = ['$scope', '$rootScope', '$timeout', 'CONSTANTS', '$location', 'PAGE_DATA'];

    function Controller($scope, $rootScope, $timeout) {
        function inIt() {
            $rootScope.$broadcast('pageLoaded');
        }

        inIt();
    }

}())

CTRL1

这将听取另一个控制器加载的天气,然后像这样触发其广播

(function() {

    'use strict';

    appName.controller('secCtrl', Controller);
    Controller.$inject = ['$scope', '$rootScope', '$timeout', 'CONSTANTS', '$location', 'PAGE_DATA'];

    function Controller($scope, $rootScope, $timeout) {

        var pageload = 0;
        $rootScope.$on('pageLoaded', function(event, obj) {
           $rootScope.$broadcast('openHelpCenterPage', {slug: slug, from: 'footer'});
        });
    }

}())

我所解释的是一个简单的方法,你可以尝试我的理解..根据你的要求改变


0
投票

你可以让你的CMSController给rootScope的一个属性一个nugdge,设置一个标志。并且你可以告诉rootScope在你发射第一个事件后每隔100ms检查1-2秒,然后只在有标志的情况下广播另一个。

但我真的建议你得到调解员服务。只需进行常规服务,但使用它进行通信,然后将getter和setter设置为某个私有对象。一个控制器设置对象,其他控制器在准备就绪时读取它这样您就知道控制器已准备就绪,因为您正在请求控制器中的对象。

angular.module('app')
  .factory('mediatorService', function() {
      var _data= {};
        return {
            //setter
            save: function (data){
              _data= data;
            },
            //getter
            get: function(){
              return _data;
            }
        }
 })

然后在一个控制器中你:

mediatorService.save(yourobject);

在另一个:

$scope.data = mediatorService.get();

对我来说,这是控制器之间数据通信的提供方式。你基本上有这个选择:

  • rootScope作为介体坏 - 污染了rootcope,如果不小心名字好可以在别处滥用 - 快速且几乎没有代码
  • 事件很好 - 可以向所有倾听的人播放,当父母和孩子都参与其中时很好 - 同步问题就像你的一样
  • route params good - 当嵌套控制器坏了时快速简单 - 仅限于上面使用
  • cookie和本地存储好 - 如果你需要坚持重新加载坏 - 超出角度范围的解决方法 - 旧浏览器只有cookie。为浏览器设置辩护,如果没有您能够做出反应,这些设置可能会被删除
  • 调解员服务好 - 简单但有效,明确分离角色不好 - 需要更多的锅炉代码
© www.soinside.com 2019 - 2024. All rights reserved.