【问题标题】:angularjs does not update scope object that changedangularjs 不会更新已更改的范围对象
【发布时间】:2015-04-30 13:30:02
【问题描述】:

我的角度控制器包含由 Google Maps api 更新的数组 named

function MyCtrl($scope) {
    var items = [
        "arizona", "texas"
    ];

    $scope.places = items;
}

我已将 items 数组绑定到名为 places 的范围变量。 Google Maps api 隐式更改项目,但更改不会出现在视图页面中。

<div ng-controller="MyCtrl">    
    <p>{{places.length}}</p>
</div>

如果我在 $cope.places 中添加或删除项目,它会更新。但如果我在 items 数组中添加项目,则不会更新。有没有办法解决这个问题?

【问题讨论】:

  • 您没有显示代码中最重要的部分 - 您更新 items
  • 如果您在角度范围变量中进行操作,则需要应用摘要循环
  • @pankajparkar - 不是只有在更新角度“外部”的范围变量时才会出现这种情况吗?
  • @Adam,听起来范围变量正在 Angular 之外更新。听起来它们正在由 Google Maps API 更新。
  • @Adam 它更常见的问题..当您从 Google Map API 事件修改范围时,范围变量不会得到更新

标签: javascript angularjs


【解决方案1】:

将项目设置为 $scope 变量,或者放弃项目并获取 Google Maps API 来更新 $scope.places

【讨论】:

  • $scope.places 引用内存中与items 相同的对象。您用来引用该对象的标识符(通过使用items$scope.places)来更新它并不重要。
  • 我同意,这就是为什么我说只是放弃“项目”。根据 OP 中的代码,项目“似乎”是不必要的。
  • 那你也知道,单纯的这么做,是解决不了OP问题的。
  • 根据 OP 发布的代码,如果 items 被更新在角度过程中,那么视图也会更新。 OP 没有显示items 的更新位置/方式,而这正是这个问题真正发生的地方。
  • @Adam 如果items 通过为其分配一个新值来更新,那么视图将不会更新,并且您的第一个语句最终可能会出错。但正如你所说:我们不知道items 是如何更新的。
【解决方案2】:

我可能过于简单化了,但 Angular 本质上是轮询更改。它以一种有助于提高性能的智能方式执行此操作,但如果值在 Angular 范围之外发生更改,则 Angular 不会立即意识到它们。

基本上,每当 Angular 执行任何代码(例如ng-click 事件)时,它都会在您的代码执行后检查更改。如果 Google Maps API 正在更改数据,那么 Angular 在再次检查之前不会知道这些更改。

最好的解决方案是让 Angular 知道这些更改何时发生(希望 Google API 对此有一个挂钩),这通常通过调用 $scope.$apply() 来完成,如果没有,您可以随时使用 Angular 的 $interval 服务偶尔运行一个方法,该方法实际上不需要做任何事情,但是在它运行之后,Angular 会检查变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多