模型更新时无法让 Angularjs 更新视图

Posted

技术标签:

【中文标题】模型更新时无法让 Angularjs 更新视图【英文标题】:Can't get Angularjs to update view when model updates 【发布时间】:2014-07-01 03:26:24 【问题描述】:

我是 Angular 新手,我被困住了。我在 jsbin.com 上有一些代码 --->(http://jsbin.com/ratageza/7/edit?html,js,output)

它并不漂亮,但它基本上显示了我在做什么。 在我的真实代码中,我使用 $http.get 调用 RESTful 后端从数据库加载数据,并使用 $http.post 调用添加到数据库。就数据库获取和更新而言,一切正常。但是在我使用“创建”表单创建一个新对象后,如果我单击“列出所有”,我的锦标赛对象不会更新。

我对在 $http.post 调用之后是否需要 $apply 感到困惑?我尝试过使用它,但要么使用错误,要么这不是我的问题。我环顾了整个***,似乎找不到我的问题的答案。

如果有人能看出我做错了什么,我将非常感谢您的帮助。

谢谢!

【问题讨论】:

【参考方案1】:

查看我在此处所做的细微更改:http://jsbin.com/ratageza/8/edit?html,js,output

变化在于您定义控制器使用的方式。您在两个不同的地方使用 TournamentController,这实际上为您提供了该控制器的两个实例,具有两个独立的、隔离的范围。您的 List All 视图绑定到一个实例,而 Create 视图绑定到一个完全不同的实例。

另外,关于 $apply 的问题。作为一般规则,你应该很少使用 $apply 并且你不应该在控制器中使用它,因为在那里使用它是不安全的。指令确实是使用 $apply 的唯一安全地方,即使在 Angular 范围之外修改数据时也应该使用指令。事情的处理顺序,你会发现如果你在控制器中使用 $scope.$apply() ,你会经常得到关于已经在摘要循环中的异常。

【讨论】:

【参考方案2】:

http://jsbin.com/ratageza/10/edit 这行得通。

这不是 $apply 或 $diget 问题。因为您将 TournamentController 放入了部分视图中。一个是创造,另一个是展示。这会生成 $scope.tournament 的不同副本;

所以我添加了一个 div 来包装表单和表格。把控制器放到它上面。删除表单和表格控制器。

希望这可以解决您的问题。 :)

【讨论】:

以上是关于模型更新时无法让 Angularjs 更新视图的主要内容,如果未能解决你的问题,请参考以下文章

在Angular中更改模型后如何更新视图?

AngularJS 中的视图未更新

Angularjs视图不更新

AngularJS:从模型数组拼接模型元素时,不会更新 ng-repeat 列表

在Angularjs2中更改输入值时如何更新模型值

第二章:2.1 AngularJS 中的数据绑定