angularjs: broadcast from directive to controller

后端 未结 3 1150
萌比男神i
萌比男神i 2021-01-11 12:04

Im trying to send a message from within a directive to its parent controller (without success)

Here is my HTML

相关标签:
3条回答
  • 2021-01-11 12:16

    There is no method on with scope. In angular it's $on

    below should work for you

    <!doctype html>
    <html ng-app="test">
      <head>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular.js"></script>
    
      </head>
     <body ng-controller="test" >    
     <my-elem/>
    
    <!-- tabs -->
    
    
     <script>
         var app = angular.module('test', []);
         app.controller('test', function ($scope) {
    
             $scope.$on('go', function () { alert('event is clicked') });
         });
         app.directive('myElem',
       function () {
           return {
               restrict: 'E',
               replace:true,
               template: '<div><input type="button" value=check/></input>',
               link: function ($scope, $element, $attrs) {
                   alert("123");
                   $element.bind('click', function () {
                       console.log("We're in");
                       $scope.$emit('go');
                   });
                   }
           }
       }) ;
    
       </script>
    </body>
    
    
    </html>
    
    0 讨论(0)
  • 2021-01-11 12:17

    To get { nr: 10 } you should add 2 arguments to listener: event and data:

    $scope.$on('go', function(event, data){ 
      alert(JSON.stringify(data));
    });
    

    (keep in mind that we use $on and not on)

    Full example in plunker

    0 讨论(0)
  • 2021-01-11 12:22

    $broadcast, $emit, and $on are deprecated

    Use of the scope/rootScope event bus is deprecated and will make migration to Angular 2+ more difficult.

    To facilitate making the transition to Angular 2+ easier, AngularJS 1.5 introduced components:

    app.component("myElem", {
        bindings: {
          onGo: '&',
        },
        template: `
            <button ng-click="$ctrl.go($event,{nr:10})">
                Click to GO
            </button>
        `,
        controller: function() {
            this.go = (event,data) => {
                this.onGo({$event: event, $data: data});
            };
        }
    });
    

    Usage:

    <div ng-controller="Ctrl as $ctrl">
       <my-elem on-go="$ctrl.fn($data)></my-elem>
    </div>
    

    The component uses an attribute with AngularJS expression (&) binding that invokes a function in the parent controller. Instead of clogging the scope/rootScope event bus with numerous events, the event goes directly to the function that uses it.

    The DEMO

    angular.module('app', [])
    .controller ('Ctrl', function () {
        this.go = (data) => {
          console.log(data);
          this.update = data;
        };
    })
    .component("myElem", {
        bindings: {
          onGo: '&',
        },
        template: `
          <fieldset>
            <input ng-model="$ctrl.nr" /><br>
            <button ng-click="$ctrl.go($event,$ctrl.nr)">
                Click to Update
            </button>
          </fieldset>
        `,
        controller: function() {
            this.nr = 10;
            this.go = (event,data) => {
                this.onGo({$event: event, $data: data});
            };
        }
    })
    <script  src="//unpkg.com/angular/angular.js"></script>
    <body ng-app="app" ng-controller="Ctrl as $ctrl">
        <p>update={{$ctrl.update}}</p>
        <my-elem on-go="$ctrl.go($data)"></my-elem>
    </body>

    For more information, see

    • AngularJS Developer Guide - Component-based application architecture
    0 讨论(0)
提交回复
热议问题