$ rootScope $ broadcast在两个不同的控制器上工作

时间:2014-05-18 11:25:37

标签: javascript angularjs

我正在尝试构建一个单页面应用程序,其中我有一个设置表单,我在其中添加一个名为Ticket Work type的变量。当我进行更新或保存在设置表单上时,我正在广播新的Ticket Work Type数组,以便它反映列表以及Ticket创建页面。

但问题是广播只能在设置表格页面控制器上工作,而不能在故障单添加控制器上工作。

这是来自设置控制器的代码,其中" 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

并且Ticket Add屏幕控制器位于:https://github.com/amitavroy/my-pm-tools/blob/master/public/assets/js/dev/tickets/controllers/ticketAddCtrl.js

1 个答案:

答案 0 :(得分:1)

任何给定的范围只会被通知从继承层次结构中较高的范围广播的事件。要在层次结构中向上发送事件,请使用$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服务(数组)注入任何需要该数据的控制器。