我完全不了解Angular数据绑定

时间:2013-06-18 16:35:52

标签: javascript angularjs

我花了几个小时尝试这段代码的细微变化,我不明白为什么一个有效,另一个没有。

这是一个场景:我正在尝试提供一个注册用户列表(我通过一个只返回几列的简单数据库查询得到),然后当点击一个用户的名字时,我将检索有关该用户的更多信息,请将其显示在不同的视图中。目前,我正在使用带有<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框架,”我想。 “这很容易。”男孩,我错了。 : - )

1 个答案:

答案 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以查看是否有任何更改并相应更新。