angular.jsをやってみる (18) - $emit -

2014-04-06T00:00:00+00:00 angular.js JavaScript

前回のangular.jsをやってみる (17) – $broadcast -の続き。$broadcastと$emitを同時に書くとごちゃごちゃになる気がしたので分けた次

で前回で$broadcastはそれを実行したスコープから下への子孫内スコープのイベントをfireするっていう形だったのですが、$emitはその逆というか自身のスコープから親のスコープへのイベントをfireするっていう事な模様

という事でやってみた

index.html

<!DOCTYPE html>
<html ng-app="app">
  <head>
    <script src="jquery.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.4/angular.min.js"></script>
    <script src="app.js"></script>
  </head>
  <body>
    <div ng-controller="Controller1">
      <a href="#" ng-click="click()">click1</a>
      <div ng-controller="Controller2">
        <a href="#" ng-click="click()">click2</a>
      </div>
    </div>
  </body>
</html>

前回と変わらないので

app.js

angular.module("app", [])
  .controller("Controller1", function($scope) {
    $scope.$on("a", function(event, args) {
      console.log("c1");
    });

    $scope.click = function() {
      console.log("click1");
      $scope.$emit("a", "A");
    };
  })
  .controller("Controller2", function($scope) {
    $scope.$on("a", function(event, args) {
      console.log("c2");
    });

    $scope.click = function() {
      console.log("click2");
      $scope.$emit("a", "A");
    };
  });

まぁ$broadcastを$emitに変えただけ。で前回の$broadcastだとController2から発生するclickメソッドで$broadcastしてもController1の方へは行かない。それは前回も書いた通り、$broadcastは子孫内イベントをfireするのでController1がController2の子孫では無いのでイベントを定義してもfireされない

で$emitの場合にはController2がController1の子孫である場合にそれを実行したスコープから親へのスコープへのイベントをfireするのでController1で定義したイベントをController2側によって$emitされた場合Controller1のイベントもfireされる。逆にController1から$emitしてもController2側で定義したイベントはfireされない

まぁ合ってるかは定かじゃないけど

  • $broadcastは自身のスコープから下層の方へのイベントをfireする
  • $emitは自身のスコープから上層の方へのイベントをfireする

っていう事なんかなと。

angular.jsをやってみる (19) - 動的に追加したエレメントに対して$animate.enter - selenium-webdriverを使ってChrome Extensionのテスト