使用&时,Angular指令不评估简单表达式。操作者

时间:2015-12-16 17:21:50

标签: angularjs

我有一个指令,其中隔离范围的配置如下:

  scope: {
    title: '@',
    icon: '@',
    onSelect: '&'
  },

当我提供一个简单的表达式时:

<my-component on-select="alert('test')"></my-component>

不评估表达式(不会触发)。

但是,以下方法确实有效:

<my-component on-select="vm.someValue = true"></my-component>

如果我将简单的alert调用移动到我的控制器中的函数并传递它,它也可以工作:

<my-component on-select="vm.sendAlert()"></my-component>

行为似乎有些不一致。有人能解释表达式绑定的要求吗?

2 个答案:

答案 0 :(得分:0)

如JB Nizet所述,角度绑定内的表达式在范围内进行评估。

  

Angular表达式无法访问全局变量,如窗口,文档或位置。这种限制是故意的。它可以防止意外访问全局状态 - 这是微妙错误的常见来源。

因此,angular只允许您在绑定内部的范围内使用简单的运算符和函数。

https://docs.angularjs.org/guide/expression

答案 1 :(得分:0)

如果你需要将一个函数作为参数传递给一个指令,使得该指令可以调用它,这是我发现使其工作的最好方法。

$scope.myfunction = function(msg) {  alert(msg); }

<my-component on-select="myfunction"/>

指令:

  scope : {  onSelect: '=' }  // Notice using '='

  scope.doCall = function() {  onSelect("some message");  }  // Call the passed in function