AngularJS在$ broadcast之后没有更新视图

时间:2015-02-06 10:41:42

标签: javascript angularjs broadcast rootscope angular-broadcast

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

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

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

修改 附件fiddle正在运行,但没有问题。两个控制器都有一个父控制器。如果我检查子控制器中的$scope,则会添加新数据但是如果我检查父控制器,则$$childTail子数据没有更改。所以广播有效。问题出在控制器结构或范围继承中。

为什么即使未在父控制器中启动和更改变量,视图也会侦听父控制器?

编辑2 至于我试图找到问题,我认为我发现了一个问题。如果我尝试从show controller广播到创建控制器。创建控制器尚未初始化。在我第二次尝试广播之后。但是视图中的变量仍然没有变化!请参阅此工作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>

1 个答案:

答案 0 :(得分:-1)

  • 检查$ on服务是否正在触发。
  • 检查SharedFactory.data是否在$ on函数内有更新的值。
  • 并且您可以在控制台中键入此内容以检查createControllers范围    展开范围对象,看看是否包含你的变量        数据有新数据..

angular.element(&#39; [纳克控制器= createController]&#39)。范围()