使用指令范围参数在指令父范围上调用函数

Nic*_*ick 29 javascript angularjs single-page-application

我正在开发一个指令,根据其模板中定义的单击事件(ng-click)显示和隐藏它的内容.在使用该指令的一些视图中,我希望能够知道该指令当前是显示还是隐藏它的内容,以便我可以响应DOM更改.该指令具有隔离范围,我试图在指令被"切换"时通知父范围.我试图通过将回调函数传递给使用它的指令来实现这一点,当指令的状态发生变化时可以调用它,即隐藏或显示

我不确定如何正确实现这一点,即指令的状态(隐藏或显示)存储在指令的隔离范围内,并在ng-click之后确定.因此,我需要从指令中调用父作用域的函数,而不是从视图中调用.

这将通过一个例子使WAAY更有意义.这是一个充满活力的展示我想做的事情:

http://plnkr.co/edit/hHwwxjssOKiphTSO1VIS?p=info

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

app.controller('MainController', function($scope){
  $scope.myValue = 'test value';
  $scope.parentToggle = function(value){
    $scope.myValue = value;
  };
});

app.directive('toggle', function(){
    return {
            restrict: 'A',
            template: '<a ng-click="toggle();">Click Me</a>',
            replace: true,
            scope: {
                OnToggle: '&'
            },
            link: function($scope, elem, attrs, controller) {
                $scope.toggleValue = false;
                $scope.toggle = function () {
                    $scope.toggleValue = !$scope.toggleValue;
                    $scope.OnToggle($scope.toggleValue)
                };
            }
        };
});
Run Code Online (Sandbox Code Playgroud)

我对Angular比较新.开始时这是一个坏主意吗?我应该使用服务还是其他东西而不是传递函数引用?

谢谢!

Seb*_*ian 50

更新

您还可以使用&绑定根作用域的功能(实际上是目的&).

为此,需要稍微改变指令:

app.directive('toggle', function(){
  return {
    restrict: 'A',
    template: '<a ng-click="f()">Click Me</a>',
    replace: true,
    scope: {
      toggle: '&'
    },
    controller: function($scope) {
      $scope.toggleValue = false;
      $scope.f = function() {
        $scope.toggleValue = !$scope.toggleValue;
        $scope.toggle({message: $scope.toggleValue});
      };
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用:

<div toggle="parentToggle(message)"></div>
Run Code Online (Sandbox Code Playgroud)

普拉克


你可以使用绑定函数=.此外,请确保范围和标记中的属性名称匹配(AngularJS将CamelCase转换为破折号表示法).

之前:

scope: {
  OnToggle: '&'
}
Run Code Online (Sandbox Code Playgroud)

后:

scope: {
  onToggle: '='
}
Run Code Online (Sandbox Code Playgroud)

此外,请勿on-toggle="parentToggle({value: toggleValue})"在主模板中使用.您不想调用该函数,只是将函数的指针传递给指令.

普拉克

  • 这就是我所需要的.谢谢你,先生. (2认同)