Javascript AngularJS在$broadcast之后未更新视图

Javascript AngularJS在$broadcast之后未更新视图,javascript,angularjs,broadcast,rootscope,angular-broadcast,Javascript,Angularjs,Broadcast,Rootscope,Angular Broadcast,我知道我不是第一个有这个问题的人,但这里没有解决办法帮我解决它 我有两个控制器一个ShowController和一个CreateController。我想从ShowController广播并在CreateCrontroller中接收。为此,我使用了广播服务。一切正常。由于单击事件,ShowController将数据保存到广播该事件的服务,并且CreateController接收事件和数据。根据数据,我想激活由CreateController启动的视图中的一个选项卡。在on方法中设置$scope变

我知道我不是第一个有这个问题的人,但这里没有解决办法帮我解决它

我有两个控制器一个ShowController和一个CreateController。我想从ShowController广播并在CreateCrontroller中接收。为此,我使用了广播服务。一切正常。由于单击事件,ShowController将数据保存到广播该事件的服务,并且CreateController接收事件和数据。根据数据,我想激活由CreateController启动的视图中的一个选项卡。在on方法中设置$scope变量后,这些变量正在更改,但视图不会更新自身

我尝试将$broadcast和$on方法包装在$timestamp中,以强制$apply。在设置$scope变量之后,我还尝试了$apply,并尝试在$apply中的匿名函数中设置$scope变量。这些解决方案中没有一个对我有效。我显然错过了什么

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

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

编辑2 就我试图定位问题而言,我认为我发现了一个问题。如果我尝试从show controller广播到create controller。创建控制器尚未初始化。在我第二次尝试后,广播效果良好。但是变量在视图中仍然没有改变!请参阅此操作以分析问题。我试图通过广播将变量从show更改为create controller。如果在“创建控制器”中检查范围,则变量已更改,但在父范围中未更改

    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>
angular.module('module.service'))
.factory('SharedFactory',['$rootScope','$timeout',函数($rootScope,$timeout){
var sharedService={};
sharedService.message='';
sharedService.data={};
sharedService.prepForBroadcast=函数(事件、数据){
this.event=事件;
这个数据=数据;
this.broadcastItem();
};
sharedService.broadcastItem=函数(){
$timeout(函数(){$rootScope.$broadcast('updateShared');});
};
返回共享服务;
}]);
//控制器1
$scope.functionName=函数(数据){
//在有$timeout和没有$timeout的情况下也尝试了此操作
$timeout(函数(){
prepForBroadcast('bookResources',{data:data});
}, 0);
//ui路由器更改状态/视图
$timeout(函数(){
$state.go('create');
}, 1);
};
//控制器2
$rootScope.$on('updateShared',function(){
//第一次尝试
$timeout(函数(){
$scope.variable.data=SharedFactory.data;//在控制器中更新,但不在视图中
}, 100);
//第二次尝试
$scope.$apply(函数(){
$scope.variable.data=SharedFactory.data;//在控制器中更新,但不在视图中
});
});
  • {{com.type} {{com.var1}}/{{com.var1}}
    • 检查$on服务是否正在触发
    • 检查SharedFactory.data是否在$on函数中具有更新的值
    • 您可以在控制台中键入此项以检查createControllers范围 展开scope对象,查看保存 数据具有新的数据

    angular.element(“[ng controller=createController]”)。scope()

    您能显示标记吗?我已经更新了小提琴和代码。这可能是父子范围的问题吗?为了避免我在方法中设置对象的问题,而不是对象或数组本身。请创建一个工作提琴以帮助我们帮助您:)我已添加了工作提琴。请看编辑。小提琴不是问题。我想是因为你的最后一点,我才发现了问题!它们都有一个父控制器。这是因为ui路由器。父控制器称为项目。如果我检查创建控制器的范围对象,则会添加新数据。但是如果我检查父控制器的scope对象,则
    $$childTail
    $scope.variable
    没有更改。如果我更改并启动子(显示,创建)控制器中的变量,为什么我的视图会听取父控制器的意见?如果问题没有解决,你能创建一个工作小提琴来分析问题吗?yetI还在黑暗中摸索。我刚刚创建的程序正在运行。我的代码不是。所以我的代码不会再有问题了。我将尝试将问题进一步本地化。我将不断更新这个问题!我想我找到了问题所在。请参见上面的第二次编辑。