我知道我不是第一个遇到这个问题的人,但这里没有解决方案帮助我解决它。
我有两个控制器 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>