Avi*_*ida 3 javascript angularjs
我研究AngularJS,今天我遇到了奇怪的情况,所以这就是代码:Plunker
还有一些我无法解释的事情:
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)函数?done({chore:chore}),我确实理解chore属性值将插入到具有相同名称的参数中 logChore(chore),但为什么我不能这样做:done(chore).好吧,如果有人能帮助我理解所有这一切,我将非常感谢,谢谢大家,祝你有愉快的一天.
我研究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对象,它扩展了计算表达式的范围.