我正在尝试构建一个单页应用程序,在该应用程序中有一个设置表单,其中添加了一个称为“票务工作类型”的变量。当我进行更新或保存在设置表单上时,我正在广播新的工单工作类型数组,以使其反映清单以及工单创建页面。
但是问题在于广播只能在设置表单页面控制器上进行,而不能在工单添加控制器上进行。
这是来自“设置”控制器的代码,在该代码之后,使用“ addTicketWorkTypes”工厂方法进行广播。这有效:
$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上参考:
设置控制器在这里:https://github.com/amitavroy/my-pm-tools/blob/master/public/assets/js/dev/settings/controllers/settingsEditCtrl.js
票证添加屏幕控制器在此处:https://github.com/amitavroy/my-pm-tools/blob/master/public/assets/js/dev/tickets/controllers/ticketAddCtrl.js
最佳答案
任何给定的作用域将仅被通知从继承层次结构中较高范围的作用域广播的事件。要向上发送事件,请使用$rootScope.$emit()
。
如果您想确定事件将被发送和接收,并且您不担心其他作用域对事件做出响应,则可以执行以下操作:
function $broadcast() {
return $rootScope.$broadcast.apply($rootScope, arguments);
}
...
$broadcast('handleTicketWorkType', response.data);
在另一个控制器中:
$rootScope.$on('handleTicketWorkType', function(data) {...});
如果那不起作用
必须(如@charlietfl建议)目标$ scope尚不存在,因此不会被通知该事件。在这种情况下,创建一个
ticketWorkTypes
服务,该服务不过是ticketWorkTypes
的列表。然后替换:$rootScope.$broadcast('handleTicketWorkType',response.data);
与
ticketWorkTypes.push(response.data);
然后将ticketWorkTypes服务(数组)注入到需要该数据的任何控制器中。