【问题标题】:AngularJS: Access directive from controllerAngularJS:来自控制器的访问指令
【发布时间】:2015-12-30 09:04:30
【问题描述】:

背景

我有一个需要由控制器访问的顶级指令。请考虑这个Plunk

指令

app.directive('topDirective', ['$compile', function($scope){
  return {
    scope: {},
    restrict: 'E',
    template: '<h3>Top Directive</h3><p><button ng-click="CallMe()">Click Me</button></p>',
    controller: function($scope) {
      var self = {};

      $scope.CallMe = function(){
        alert('Call Me');
      };
    },
    link: function($scope, $elem, $attrs, $ctrl) {

    }
  };
}]);

需要访问的控制器

app.controller('subController', [
  '$scope', 
      function($scope){
        var self = {};

        $scope.CallDirective = function() {
          alert('>>> Replace by call to directive function CallMe (somehow) <<<')
        };
      }]);

问题

我需要做什么来替换这一行:

alert('>>> Replace by call to directive function CallMe (somehow) <<<')

通过实际调用指令中的 CallMe() 函数?

如果不能直接使用,有没有办法共享指令和控制器都可以使用的功能?我的第一个想法是服务,但它需要在真实场景中进行 DOM 操作,所以这不是一个选项。

有什么建议吗?

【问题讨论】:

  • 您可以从控制器广播并在指令上收听它

标签: javascript .net angularjs asp.net-mvc


【解决方案1】:

在控制器中发出事件

app.controller('subController', [
  '$scope','$rootScope', 
      function($scope,$rootScope){
        var self = {};

        $scope.CallDirective = function() {
          var data ='This is new data';
          $rootScope.$emit('callDirective',data);
        };
      }]);

在指令中你可以这样做

app.directive('topDirective', ['$compile', function($scope){
  return {
    scope: {},
    restrict: 'E',
    template: '<h3>Top Directive</h3><p><button ng-click="CallMe()">Click Me</button></p>',
    controller: function($scope,$rootScope) {
      var self = {};

      $scope.CallMe = function(data){
        alert(data);
      }; 
      $rootScope.$on('callDirective',function(type,data){
         $scope.CallMe(data);
});
    },
    link: function($scope, $elem, $attrs, $ctrl) {

    }
  };
}]);

【讨论】:

  • 它有效,谢谢!我更新了我的Plunk
猜你喜欢
  • 2014-01-03
  • 1970-01-01
  • 2018-04-19
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多