Javascript AngularJS在$broadcast之后未更新视图
我知道我不是第一个有这个问题的人,但这里没有解决办法帮我解决它 我有两个控制器一个ShowController和一个CreateController。我想从ShowController广播并在CreateCrontroller中接收。为此,我使用了广播服务。一切正常。由于单击事件,ShowController将数据保存到广播该事件的服务,并且CreateController接收事件和数据。根据数据,我想激活由CreateController启动的视图中的一个选项卡。在on方法中设置$scope变量后,这些变量正在更改,但视图不会更新自身 我尝试将$broadcast和$on方法包装在$timestamp中,以强制$apply。在设置$scope变量之后,我还尝试了$apply,并尝试在$apply中的匿名函数中设置$scope变量。这些解决方案中没有一个对我有效。我显然错过了什么 编辑 附件正在工作,但没有问题。两个控制器都有一个父控制器。如果我检查子控制器中的Javascript AngularJS在$broadcast之后未更新视图,javascript,angularjs,broadcast,rootscope,angular-broadcast,Javascript,Angularjs,Broadcast,Rootscope,Angular Broadcast,我知道我不是第一个有这个问题的人,但这里没有解决办法帮我解决它 我有两个控制器一个ShowController和一个CreateController。我想从ShowController广播并在CreateCrontroller中接收。为此,我使用了广播服务。一切正常。由于单击事件,ShowController将数据保存到广播该事件的服务,并且CreateController接收事件和数据。根据数据,我想激活由CreateController启动的视图中的一个选项卡。在on方法中设置$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还在黑暗中摸索。我刚刚创建的程序正在运行。我的代码不是。所以我的代码不会再有问题了。我将尝试将问题进一步本地化。我将不断更新这个问题!我想我找到了问题所在。请参见上面的第二次编辑。