使用隔离范围时,从指令调用控制器的功能?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用隔离范围时,从指令调用控制器的功能?相关的知识,希望对你有一定的参考价值。

我想从Controller调用Directive的函数,它用于验证。但是当我使用隔离范围时,我对如何从Directive调用它有点困惑。这是指令代码: -

App.directive('test',function(){
    return{
    require: "ngModel",
     scope:{
         a:"=",
         b:"=",
         c:'=',
         d:'='
            },
         link: function(scope, element, attributes,modelVal )
            {
            modelVal.$validators.test= function(val)
              {
                return false;
               //isolated scope values will make if condition true or false.
               if(scope.a=="true"){
                //I need to call a function of controller here. But how can 
                //i call that function from directive? this is my problem
                         } 
               }
             scope.$watch("a", function()
               {
                    modelVal.$validate();
                });

         }//end of link function;
      }//end of return;
});//end of directive;

Function在我的controller,我想我不需要写controller code。在我的html中,我将此指令称为:

     <test a="1" b="2" c="3" d="4" ng-model="abc"></test>

我需要做什么改变才能在我的directive中调用controller function这是$scope.testFunction()

答案

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

module.controller('TestController', function($scope){
  $scope.text = 'test';
  
  // Will be invoked from 'test' directive
  $scope.alertMe = function(text){
    alert(text);
  };
});

module.directive('test', function(){
  return {
    restrict: 'E',
    template: '<input ng-model="text" ng-change="onChange(text)" />',
    scope: {
      text: '='
    },
    link: function(scope, elem, attr){
      scope.onChange = function(text){
      
      // Invoking parent controller function
       scope.$parent.alertMe(text);
      }
    }
  }
})
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<body>

<div ng-app="myModule" ng-controller="TestController">
 
<test text="text"></test>

</div>
</body>
</html>
另一答案

我给了一个样本,试试这样。

控制器:

module.controller('TestController', function($scope){
  $scope.onTextChange = function(text){
    alert(text);
  };
})

HTML:

<test my-func="onTextChange(text)"></test>

指示:

module.directive('test', function(){
  return {
    restrict: 'E',
    template: '<input ng-model="text" ng-change="onChange(text)" />',
    scope: {
      myFunc: '&'
    },
    link: function(scope, elem, attr){
      scope.onChange = function(text){
        if(typeof scope.myFunc === 'function'){
          // Calling the parent controller function
          scope.myFunc({text: text});
        }
      }
    }
  }
})

以上是关于使用隔离范围时,从指令调用控制器的功能?的主要内容,如果未能解决你的问题,请参考以下文章

具有隔离范围的嵌套指令中的双向绑定延迟

AngularJS指令隔离范围和父范围

AngularJS自定义验证指令 - 如何避免使用隔离范围

为啥我应该在 AngularJS 中使用隔离范围指令?

AngularJS中带有ng-repeat范围的指令隔离范围

将范围变量从控制器绑定到指令而不使用$ watch