0

我知道我不是第一个遇到这个问题的人,但这里没有解决方案帮助我解决它。

我有两个控制器 ShowController 和 CreateController。我想从 ShowController 广播并在 CreateCrontroller 中接收。为此,我使用了 BroadcastService。一切都按预期工作。由于单击事件,ShowController 将数据保存到广播事件的服务中,而 CreateController 接收事件和数据。取决于数据,我想激活一个选项卡,即由 CreateController 启动的视图。在 on-method 中设置 $scope 变量后,它们会发生变化,但视图不会自行更新。

我试图将 $broadcast 以及 $on 方法包装在 $timestamp 中以强制 $apply。在设置了 $scope 变量后,我还尝试了 $apply,并尝试在 $apply 中的匿名函数中设置 $scope 变量。这些解决方案都不适合我。我显然错过了一些东西。

编辑附加 的小提琴正在工作,但没有问题。两个控制器都有一个父控制器。如果我$scope在子控制器中检查,则添加新数据,但如果我检查父控制器$$childTail,则子数据未更改。所以广播工作。问题出在控制器结构或范围继承中。

为什么即使变量没有在父控制器中初始化和更改,视图也会监听父控制器?

编辑 2 就我试图定位问题而言,我认为我发现了一个问题。如果我尝试从显示控制器广播到创建控制器。创建控制器尚未初始化。在我第二次尝试之后,广播工作。但是视图中的变量仍然没有改变!请参阅此工作plnkr以分析问题。我尝试通过广播将变量从节目更改为创建控制器。如果您检查创建控制器中的范围,变量会更改,但在父范围中它没有。

    angular.module('module.service')
      .factory('SharedFactory',['$rootScope', '$timeout', function ($rootScope, $timeout) {
        var sharedService = {};

        sharedService.message = '';
        sharedService.data = {};

        sharedService.prepForBroadcast = function(event, data) {
          this.event = event;
          this.data = data;
          this.broadcastItem();
        };

        sharedService.broadcastItem = function() {
          $timeout(function() {$rootScope.$broadcast('updateShared');});
        };

        return sharedService;

      }]);


    // controller 1

     $scope.functionName = function(data) {
         // tried this as well with and without the $timeout
        $timeout(function() {
          SharedFactory.prepForBroadcast('bookResources', {data:data});
        }, 0);
         // ui-router changes state / view
         $timeout(function() {
           $state.go('create');
         }, 1);
        };

    // controller 2

    $rootScope.$on('updateShared', function() {
        // first attempt
      $timeout(function() {
        $scope.variable.data = SharedFactory.data; // updating in controller but not in view
       }, 100);
        // seconde attempt
       $scope.$apply(function () {
         $scope.variable.data = SharedFactory.data; // updating in controller but not in view
       });
    });

<ol>
    <li data-ng-repeat="phase in array">
        <span data-ng-repeat="com in phase.array">{{com.type}}
            <span data-ng-click="functionName(phase)">        {{com.var1}}/{{com.var1}}
            </span>
        </span>
    </li>
</ol>
4

1 回答 1

-1
  • 检查 $on 服务是否正在触发。
  • 检查 SharedFactory.data 是否在 $on 函数中具有更新的值。
  • 您可以在控制台中键入它来检查 createControllers 范围展开范围对象并查看保存数据的变量是否具有新数据..

angular.element('[ng-controller=createController]').scope()

于 2015-02-06T12:11:36.530 回答