1

我有一个指令,当点击表格行时广播一个事件。这是指令:

angular.module('app').directive('encounterItemTable', function () {
  return {
    restrict: 'A',
    replace: true,
    templateUrl: 'views/encounter.item.table.html',
    scope: {
      encounters : '='
    },

    link: function(scope) {
      scope.getSelectedRow = function(index) {
        scope.$broadcast('selectedRow', { rowIndex: index });
      };
    }
  };
});

这是调用getSelectedRow

<tr  ng-class="{selected: $index==selectedIndex}" ng-repeat="encounter in encounters | filter:search" data-id="{{encounter.id}}" ng-click="getSelectedRow($index)">

getSelectedRow()单击该行时会调用我的函数。索引是正确的。另一方面,控制器永远不会听到任何声音。这是控制器中的代码。

  $scope.$on('selectedRow', function(event, data) {
    $scope.selectedIndex = data.rowIndex;
    $scope.selectedEncounter = $scope.encounters[data.rowIndex];
  });

为什么控制器听不到事件?我错过了什么?

4

3 回答 3

1

它是 $rootScope.$broadcast。如果它只广播到当前范围,您的控制器将看不到它。

于 2013-10-28T21:35:49.613 回答
1

$broadcast将事件发送给孩子。指令嵌套在控制器中,因此需要将事件发送给父级。用于scope.$emit通过父母推动事件。阅读范围文档中标题为范围事件传播的部分

于 2013-10-28T21:36:02.617 回答
1

我用$rootScope.$broadcast(event, data). 我使用事件来解耦组件,即发出事件的组件和事件的侦听器不需要相互了解。

如果事件可以合理地包含在组件(指令)中,那么您必须关心 DOM 中侦听器/发射器的相对位置在哪里。我自己没有遇到过这个问题,所以通常使用$rootScope.$broadcast()另一个好处是应用程序中的任何组件都可以监听这些事件,因此侧边栏中的某些内容可以根据表中的事件进行更新(可能不在同一个 DOM 层次结构中)

于 2013-10-28T22:02:22.363 回答