javascript - Angularjs,指令,符号

标签 javascript angularjs

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

有些事情我无法解释:

  1. 如果您可以从上面的 Plunker 链接中查看 console.log(scope.done) 的值,这是值 function ( a){return l(e,a)}这个值看起来像压缩函数版本,在我玩了一下代码后我发现上面的函数返回(和我假设)调用表达式logChore(chore)我们传递给done属性done="logChore(chore)",所以通过执行函数(a){return l(e,a)} 我们执行 logChore(chore) 函数 ?
  2. 另一件事是为什么使用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/

相关文章:

javascript - 如何根据express/mssql中间件反馈有条件地渲染页面

javascript - 本地存储的 Angular 服务

javascript - highcharts-ng 不显示饼图

javascript - 根据窗口大小调整 Highchart 的大小

javascript - Extjs 面板内部的 Angular

javascript - 单击按钮并使用 JavaScript(或 jquery)获取同一行中单元格的值

javascript - 使用 ng-switch 构建切换

javascript - 单击按钮时更改值

javascript - 与 IP 地址匹配的动态 AngularJS 验证,但最后一个八位字节在特定范围内

angularjs - 将样式属性应用于 Angular js中的ng-bind指令