我花了几个小时尝试这段代码的细微变化,我不明白为什么一个有效,另一个没有。
这是一个场景:我正在尝试提供一个注册用户列表(我通过一个只返回几列的简单数据库查询得到),然后当点击一个用户的名字时,我将检索有关该用户的更多信息,请将其显示在不同的视图中。目前,我正在使用带有<a>
指令的常规ng-click
元素来设置名为currentid
的值。在我的代码的其他地方,每当$watch()
发生更改时,我都会使用currentid
发送新的数据库查询。该部分似乎正在工作(我看到我的监视回调的console.log()
输出,数据库查询正在吐出正确的数据)...但有时currentid
会发生变化,有时它不会,我无法弄清楚原因。
(点击表格中的“rmunn”和“admin”链接:下面的“Currrent ID”值应该更新。请原谅几乎完全没有CSS;我是编码员,不是图形设计师( “该死的,吉姆!”),现在我的时区也很晚了,所以我没有动力去解决这个问题。它的功能,它表明了问题,我将把它留在那里。)
这两者之间的唯一区别是一个绑定到currentid
,另一个绑定到vars.currentid
。现在,我理解为什么绑定到currentid
在父级和子级范围的情况下不起作用(子级的值会掩盖父级的值);因为我来自Python背景,这对我来说很有意义(它类似于Python的实例名称空间可以影响类中定义的任何名称空间)。但在这个jsfiddle中,我只使用一个控制器 - 并非所有这些变量都在同一范围内?
我整天都在反对这一点,而我试图阅读的几个Stack Overflow答案(比如How does data binding work in AngularJS?)让我更加困惑:$apply()
和$digest()
和范围,哦,我的!所以,如果有人能给我一个很好的简单初学者的Angular范围指南(或者指向我已经错过的已经写好的指南),我将非常感激。
“我学过Clojure和Haskell,我可以学习一个简单的Javascript框架,”我想。 “这很容易。”男孩,我错了。 : - )
答案 0 :(得分:4)
您遇到ng-repeat
创建子范围的问题。
<tr ng-repeat="user in data" blarg="{{user.id}}">
<!-- currentid here is part of the ng-repeat child scope
and not your root scope -->
<td><a href="#{{user.id}}" ng-click="currentid = user.id">{{user.userName}}</a></td>
<td>{{user.email}}</td>
</tr>
如果您需要访问父作用域,可以使用$parent.currentid
<a href="#{{user.id}}" ng-click="$parent.currentid = user.id">{{user.userName}}</a>
每当修改角度世界之外的值时,您都需要使用$apply()
。例如,使用setTimeout()
或jQuery插件。致电$apply()
警告Angular重新评估scope
以查看是否有任何更改并相应更新。