使用$ emit从指令向控制器发送事件 [英] Send an event using $emit from directive to controller

查看:103
本文介绍了使用$ emit从指令向控制器发送事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 $ emit 从项目到控制器选择项目时发送事件。我有两个组织更新功能,另一个用于人员。我的指令应该指定应该发出哪个事件。

I'm trying to send an event when an item gets selected, from directive to controller using $emit. I've two update functions for organizations and another for people. My directive should specify which event should emit.

这是我的更新函数

//对于组织



// For organization

 $scope.updateOrgs = function(selectedVal) {

 }

//对于人

$scope.updatepeople = function(selectedVal, type) {

}

当它是我的指令应该为 updatepeople()提出一个emit事件,如果它是org它应该提高 updateorg()

When it is people my directive should raise an emit event for updatepeople (), if it was org it should raise updateorg().

我的指令看起来像......

my directive looks like...

.directive('search', function ($timeout) {
    return {
        restrict: 'AEC',
        scope: {
            model: '=',
            searchobj: '@',
        },
        link: function (scope, elem, attrs, index) {
            scope.handleSelection = function (selectedItem) {
                scope.model = selectedItem;
                scope.searchModel="";
                scope.current = 0;
                scope.selected = true;
                $timeout(function () {
                    scope.onSelectupdate();
                }, 200);
            };
            scope.Delete = function (index) {
                    scope.selectedIndex = index;
                    scope.delete({ index: index });
            };
            scope.Search = function (searchitem,event,searchobj) {
//                   alert('item entered'+name)
                   scope.searching = searchitem;
                   scope.searchobject = searchobj;
                   scope.onSearch({ searchitem: searchitem , searchobj:searchobj}); 
            };
            scope.current = 0;
            scope.selected = true;
            scope.isCurrent = function (index) {
                return scope.current == index;
            };
            scope.setCurrent = function (index) {
                scope.current = index;
            };
        },
        controller: ['$scope','$element','$rootScope','SearchOrg', function($scope,$element,$rootScope,SearchOrg) {
            $scope.searchItem = function(filter,searchobj){
                //alert('search'+searchobj);
                SearchOrg().fetch({'filter': filter, 'searchType': searchobj}).$promise.then(function(value){
                    $scope.searchData = value.data;
                    console.info($scope.searchData);
                },
                function(err) { 
                });
            }
        }],
        templateUrl: TAPPLENT_CONFIG.HTML_ENDPOINT[0] + 'home/genericsearch.html'
    }
});;

HTML代码段

<search searchobj="tei-org" selectedItems="arrayofIds" search-id="someidtoIdentify"/> 

我怎么能这样做两个函数都在不同的控制器中,我还需要从指令发送参数使用 $ emit 来控制器?

How can I do this both functions are in different controllers, and also I need to send parameters from directive to the controller using $emit?

推荐答案

使用$ scope。$ emit和$ scope。$ on

我猜你的其他控制器不是父母,所以使用 $ broadcast 查看第二个选项。

I'm guessing that your other controllers are not parents, so look at the second option using $broadcast.

var app = angular.module('app', []);

app.controller('firstController', function($scope) {
  $scope.selectedOrgs = []
  $scope.$on('updateorgs', function(evt, data) {
    $scope.selectedOrgs.push(data);
  });
});

app.controller('secondController', function($scope) {
  $scope.selectedPeople = []
  $scope.$on('updatepeople', function(evt, data) {
    $scope.selectedPeople.push(data);
  });
});

app.directive('someDirective', function($rootScope) {
  return {
    scope: {},
    link: function(scope) {
      scope.options = [{
        id: 1,
        label: 'org a',
        type: 'org'
      }, {
        id: 2,
        label: 'org b',
        type: 'org'
      }, {
        id: 3,
        label: 'person a',
        type: 'person'
      }, {
        id: 4,
        label: 'person b',
        type: 'person'
      }];
      scope.changed = function() {
        if (scope.selected) {
          var updatetype = scope.selected.type; 
          if (updatetype === 'person') {
            $rootScope.$broadcast('updatepeople', scope.selected);
          } else if (updatetype === 'org') {
            $rootScope.$broadcast('updateorgs', scope.selected);
          }
        }
      };
    },
    template: '<select ng-change="changed()" ng-model="selected" ng-options="option.label for option in options"><option value="">Select</option></select>'
  };
});

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>

<div ng-app='app'>
  <some-directive></some-directive>
  <div ng-controller='firstController'>
    <div>ORGS:</div>
    <div>
      {{ selectedOrgs }}
    </div>
  </div>
  <div ng-controller='secondController'>
    <div>PEOPLE:</div>
    <div>
      {{ selectedPeople }}
    </div>
  </div>
</div>

这篇关于使用$ emit从指令向控制器发送事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆