如何使用混合参数调用父范围函数?

时间:2016-08-07 09:44:22

标签: javascript angularjs angularjs-directive isolate-scope

这是我的情况 - 我有指向隔离范围的指令,我想通过混合参数调用父&#scope范围内的函数。混合 - 意思是,一个参数来自指令,另一个参数来自父级。

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

我在考虑两种方法 - 一种是模拟currying,用父的参数调用函数,这将返回一个接受指令参数的函数。第二 - 以某种方式在父范围内引入指令变量,所以我可以写:

&

我更喜欢第二个。但我不知道该怎么做,即如何将指令变量引入父母的范围 - 没有做手册&#34;反向&#34;绑定,如:

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

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

1 个答案:

答案 0 :(得分:3)

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

首先,设置主应用程序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)"视图中引用了SELECT Visitid_fk, AE, Med FROM AES t1 LEFT JOIN ( SELECT Visitid_fk FROM AES WHERE AE = 'Headache' ) t2 ON t1.Visitid_fk = t2.Visitid_fk WHERE t2.Visitid_fk IS NULL 。在幕后,angular将通过其$ parse服务正确地将parentVar范围解析为MainCtrl,并将directiveVar范围解析为指令。

这里有一个完整的plunkr