Angularjs,指令,&符号

Avi*_*ida 3 javascript angularjs

我研究AngularJS,今天我遇到了奇怪的情况,所以这就是代码:Plunker

还有一些我无法解释的事情:

  1. 如果你可以看看上面console.log(scope.done)Plunker链接的值,这是function (a){return l(e,a)}这个值看起来像压缩函数版本的值,在我用代码玩了一下后我发现上面的函数返回(我假设)调用logChore(chore)我们传递给done属性的表达式done="logChore(chore)",那么通过执行function (a){return l(e,a)}我们执行的logChore(chore)函数
  2. 另一件事是为什么使用对象映射 done({chore:chore}),我确实理解chore属性值将插入到具有相同名称的参数中 logChore(chore),但为什么我不能这样做:done(chore).

好吧,如果有人能帮助我理解所有这一切,我将非常感谢,谢谢大家,祝你有愉快的一天.

Ila*_*mer 7

我研究AngularJS,今天我遇到了奇怪的情况.

我不明白为什么它很奇怪,它只是angular.js的工作原理,它很棒!

这个值看起来像压缩函数版本 ......

你是对的,如果我Console.log(scope.done)使用非缩小代码运行,我得到:

function (locals) {
  return parentGet(scope, locals);
} 
Run Code Online (Sandbox Code Playgroud)

它只是来自compile.js源代码的回调:

case '&':
  parentGet = $parse(attrs[attrName]);
  isolateScope[scopeName] = function(locals) {
    return parentGet(scope, locals);
  };
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在使用时scope: { done : "&"},angular 使用for解析属性内的表达式$parse,并返回一个函数,该函数在运行时将针对父作用域进行求值.

您必须了解此表达式:done="logChore(chore)"最终将针对外部作用域运行,但外部作用域可能没有chore属性.

一个很好的例子是角度事件指令,例如ng-click="do($event)",外部范围没有$event属性,那么它来自何处?

Angular通过提供locals对象作为第二个参数来解决此问题,该参数允许您针对扩展范围运行表达式.

为什么我不能这样做:完成(家务)

原因是因为angular不会将属性&视为函数,而是将其视为表达式.实际上,您可以在该属性中放置任何表达式,例如:

  • done = "logChore(chore); x = 1"
  • done = "logChore(otherVar, chore)"
  • done = "isLogged || logChore(chore)"
  • done = "logChore(chore + 1)"

当您在指令中调用函数时,您传递的参数与将传递给控制器​​函数的参数不同,只是在您的情况下它会发生相同的情况.

你传递的是一个locals对象,它扩展了计算表达式的范围.