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親を通じてイベントを押し上げるために使用します。Scope Events Propagationというタイトルのスコープ ドキュメントのセクションを読んでください。

于 2013-10-28T21:36:02.617 に答える
1

私は使用します$rootScope.$broadcast(event, data)。私はイベントを使用してコンポーネントを分離します。つまり、イベントを発行するコンポーネントとイベントのリスナーは、お互いについて知る必要がありません。

イベントがコンポーネント (ディレクティブ) に合理的に含まれる可能性がある場合、リスナー/エミッターの相対位置が DOM のどこにあるかを気にする必要があります。私はこれに遭遇したことがないので、通常、アプリ内の任意の$rootScope.$broadcast()コンポーネントがこれらのイベントをリッスンできるという別の利点を使用して、サイドバーの何かがテーブルからのイベントに関連して更新できるようにします (おそらく同じ DOM 階層にはありません)。

于 2013-10-28T22:02:22.363 に答える