如何使用混合参数调用父级的作用域函数?

How to call parent's scope function with mixed arguments?

这是我的情况——我有独立范围的指令,我想使用 mixed 参数从父范围调用函数。混合——意思是,一个参数来自指令,另一个来自父级。

如果参数来自指令,我可以将该函数与 < 绑定并使用它,如果参数来自父级范围,我可以将整个函数调用与 & 绑定。

我正在考虑两种方法 -- 一种是模拟柯里化,使用父参数调用函数,这将 return 函数接受指令参数。第二——以某种方式在父级范围内引入指令变量,所以我可以写:

<my-directive on-alarm="emergency(parent_var,dir_var)"/>

我更喜欢第二个。但我不知道该怎么做,即如何将指令变量引入父级范围——而不进行手动 "reverse" 绑定,例如:

<my-directive for_sake_of_calling="dir_var" on-alarm="emergency(parent_var,dir_var)"/>

但这些更像是我的猜测 -- 主要问题 是:如何使用混合参数调用父函数?

您可以通过执行以下操作实现此目的:

首先,设置主应用程序 HTML,

<body ng-app="app">
    <div ng-controller="MainCtrl as vm">
        Emergency text: {{vm.emergencyText}}
        <my-directive on-alarm="vm.emergency(vm.parentVar, directiveVar)"></my-directive>
    </div>
</body>

您会注意到 on-alarm 回调包含对 vm.parentVar 变量的引用,该变量仅引用 MainCtrl.parentVar,而 directiveVar 将来自指令本身。

现在我们可以创建我们的主控制器了:

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

angular
  .module('app')
  .controller('MainCtrl', function () {
    // Initialise the emergency text being used in the view.
    this.emergencyText = '';
    // Define our parent var, which is a parameter called to the emergency function.
    this.parentVar = 'This is an emergency';

    // Define the emergency function, which will take in the parent 
    // and directive text, as specified from the view call 
    // vm.emergency(vm.parentVar, directiveVar).
    this.emergency = function (parentText, directiveText) {
      this.emergencyText = parentText + ' ' + directiveText;
    }.bind(this);
  });

最后,我们将创建指令。

angular
  .module('app')
  .directive('myDirective', function () {
    return {
      scope: {
        onAlarm: '&'
      },
      link: function (scope, element, attrs) {
        scope.onAlarm({ directiveVar: 'from myDirective' });
      }
    }
  });

奇迹发生在我们调用 scope.onAlarm({ directiveVar: 'from myDirective' }); 之后。此调用告诉 angular 警报回调函数(紧急)将可以访问 directiveVar,我们之前在视图中通过 on-alarm="vm.emergency(vm.parentVar, directiveVar)" 引用了它。在幕后,angular 将通过其 $parse 服务将 parentVar 范围正确解析为 MainCtrl,将 directiveVar 范围正确解析为指令。

这是完整的 plunkr