Javascript $rootScope$广播在两个不同的控制器上工作
我正在尝试构建一个单页应用程序,其中有一个设置表单,我在其中添加了一个名为ticketworktype的变量。当我在设置表单上进行更新或保存时,我正在广播新的票证工作类型数组,以便它反映列表以及票证创建页面 但问题是广播只在设置表单页面控制器上工作,而不在票证添加控制器上工作 这是来自设置控制器的代码,在“addTicketWorkTypes”工厂方法之后,我执行广播。这项工作:Javascript $rootScope$广播在两个不同的控制器上工作,javascript,angularjs,Javascript,Angularjs,我正在尝试构建一个单页应用程序,其中有一个设置表单,我在其中添加了一个名为ticketworktype的变量。当我在设置表单上进行更新或保存时,我正在广播新的票证工作类型数组,以便它反映列表以及票证创建页面 但问题是广播只在设置表单页面控制器上工作,而不在票证添加控制器上工作 这是来自设置控制器的代码,在“addTicketWorkTypes”工厂方法之后,我执行广播。这项工作: $scope.addNewTicketWorkType = function(newticketWorkType)
$scope.addNewTicketWorkType = function(newticketWorkType) {
if (newticketWorkType != '') {
ticketFact.addTicketWorkTypes(newticketWorkType, $scope.workspaceId).then(function(response) {
$rootScope.$broadcast('handleTicketWorkType',response.data);
ticketFact.ticketWorkType = '';
});
}
};
这将更新同一控制器上的列表
/*update ticket work type when changes at any place*/
$scope.$on('handleTicketWorkType', function(events, ticketWorkType) {
$scope.ticketWorkType = ticketWorkType;
console.log('Scope updated settingsEditCtrl');
});
但是相同的$scope.$on在不同的控制器上不起作用。你能帮忙吗
整个代码在Github上也可供参考:
设置控制器位于此处:
票证添加屏幕控制器在这里:任何给定的作用域都只会收到从继承层次结构中较高的作用域广播的事件的通知。要向层次结构上发送事件,请使用
$rootScope.$emit()
如果要确保事件将被发送和接收,并且不担心其他作用域响应事件,可以执行以下操作:
function $broadcast() {
return $rootScope.$broadcast.apply($rootScope, arguments);
}
在其他控制器中:
$rootScope.$on('handleTicketWorkType', function(data) {...});
如果那不起作用
必须是(正如@charlietfl所建议的)目标$scope还不存在,因此没有收到事件通知。在这种情况下,创建一个ticketWorkTypes
服务,它只是一个ticketWorkTypes
列表。然后替换:
$rootScope.$broadcast('handleTicketWorkType',response.data);
与
然后将ticketWorkTypes服务(数组)注入需要该数据的任何控制器。
$broadcast
可由当时可用的所有子作用域监视。我看不出使用$scope有什么区别。
上的$on和不需要注入$rootScope
都同意应该有更好的方法,但这个选项至少确认了目标作用域在广播时存在。我尝试了这种方法,但再次从Ticket Add页面调用该函数。关于层次结构,两者都是不同的路线,因此我认为层次结构不是问题(听起来,当您进行广播时,控制器不可用,您可能需要使用服务来存储数据
$rootScope.$broadcast('handleTicketWorkType',response.data);
ticketWorkTypes.push(response.data);