我研究 AngularJS,今天我遇到了奇怪的情况,所以这是代码:Plunker
有些事情我无法解释:
- 如果您可以从上面的 Plunker 链接中查看
console.log(scope.done)
的值,这是值function ( a){return l(e,a)}
这个值看起来像压缩函数版本,在我玩了一下代码后我发现上面的函数返回(和我假设)调用表达式logChore(chore)
我们传递给done属性done="logChore(chore)"
,所以通过执行函数(a){return l(e,a)}
我们执行logChore(chore)
函数 ? - 另一件事是为什么使用object map
done({chore:chore})
,我明白chore 属性值 将是插入具有相同名称的参数logChore(chore)
,但为什么我不能这样做:done(chore)
。
好吧,如果有人能帮助我理解所有这些,我将非常感激,谢谢大家,祝你有美好的一天。
最佳答案
I study AngularJS, And today i run into weird case.
我不明白为什么它很奇怪,这就是 angular.js 的工作方式,而且很棒!
this value looks like compressed function version...
你是对的,如果我用非压缩代码运行 Console.log(scope.done)
我得到:
function (locals) {
return parentGet(scope, locals);
}
只是compile.js source code的回调:
case '&':
parentGet = $parse(attrs[attrName]);
isolateScope[scopeName] = function(locals) {
return parentGet(scope, locals);
};
如您所见,当使用 scope: { done : "&"}
时,angular 使用 $parse
解析属性内的表达式,并返回一个函数运行时将针对父范围进行评估。
你必须明白这个表达式:done="logChore(chore)"
最终会针对外部范围运行,但外部范围可能没有 chore
属性.
一个很好的例子是像 ng-click="do($event)"
这样的 Angular 事件指令,外部作用域没有 $event
属性,所以它来自哪里?
Angular 通过提供一个局部对象作为第二个参数来解决这个问题,它允许您针对扩展范围运行表达式。
why can't i just do that: done(chore)?
原因是因为angular不把带有&
的属性当作一个函数,而是把它当作一个表达式。实际上,您可以在该属性中放置任何表达式,例如:
done = "logChore(chore); x = 1"
done = "logChore(otherVar, chore)"
done = "isLogged || logChore(chore)"
done = "logChore(chore + 1)"
当您在指令中调用该函数时,您传递的参数与将传递给 Controller 函数的参数不同,只是碰巧在您的情况下是相同的。
您传递的是一个本地对象,它扩展了表达式将被评估的范围。
关于javascript - Angularjs,指令,符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21533542/