7

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

场景如下:我正在尝试提供一个注册用户列表(我通过一个简单的数据库查询来获得它,它只返回几列),然后当一个用户的名字被点击时,我将检索更多关于该用户从数据库中,并在不同的视图中显示它。目前,我正在使用常规<a>元素执行此操作,其中的ng-click指令设置了一个名为currentid. 在我的代码的其他地方,$watch()每当发生更改时,我都会发送一个新的数据库查询currentid。那部分似乎正在工作(我看到console.log()我的手表回调的输出,并且数据库查询正在吐出正确的数据)......但有时会currentid改变,有时不会,我不知道为什么。

(单击表中的“rmunn”和“admin”链接:下面的“当前 ID”值应该更新。请原谅几乎完全没有 CSS;我是编码人员,而不是图形设计师(“该死,吉姆!”),而且现在我的时区也很晚了,所以我没有动力去美化它。它很实用,它说明了问题,我将把它留在那里。)

这两者之间的唯一区别是一个绑定到currentid,另一个绑定到vars.currentid。现在,我明白了为什么绑定到currentid在父范围和子范围的情况下不起作用(孩子的价值会掩盖父母的价值);因为我来自 Python 背景,所以这对我来说很有意义(这类似于 Python 的实例命名空间如何隐藏类上定义的任何内容的命名空间)。但是在这个 jsfiddle 中,我只使用一个控制器——不是所有这些变量都在同一个范围内吗?

我整天都在为此苦苦挣扎,而我尝试阅读的几个 Stack Overflow 答案(例如,数据绑定在 AngularJS 中如何工作?)让我更加困惑:$apply()还有$digest()作用域,哦我的!因此,如果有人能给我一份关于 Angular 范围的简单入门指南(或者指出我已经写过但我错过的指南),我将不胜感激。

“我学过 Clojure 和 Haskell,我可以学习一个简单的 Javascript 框架,”我想。“这很容易。” 男孩,我错了吗。:-)

4

1 回答 1

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

于 2013-06-18T16:41:41.647 回答