【问题标题】:AngularJS $scope Updated, Not The ViewAngularJS $scope 更新了,不是视图
【发布时间】:2014-12-12 17:58:58
【问题描述】:

我查看了很多帖子,但还没有找到与我正在寻找的内容完全匹配的帖子。我拆分为多个控制器,以将功能清晰地划分为多个区域。有一个集中式服务,其中包含在各个控制器之间传递并显示在不同区域的屏幕上的所有数据。我遇到了一个控制器的问题,该控制器正在获取与其他控制器相同的数据,但是当服务中的数据被操作时,UI 没有更新。在每个控制器中,我为服务中的对象设置了一个范围变量..

$scope.package = SampleService.getPackage();

然后我使用 ng-repeat 循环包,该包包含一个数组,并且可以包含要显示的嵌套数据数组。在此过程中,数据被处理并分配给这些项目(在服务内,而不是控制器内)。如果我将 $scope.package 变量放在一个循环中,我可以看到该变量正在从服务中更新(在控制台中查看它),但更改不会反映在屏幕上。特别是,我设置了几个值 true/false,根据它们的值,屏幕上会显示几个图标。直到我单击屏幕上的某些内容(假设这会触发摘要循环),图标才会显示(未检测到范围变量未更改)。然后将显示图标。但是,它们会根据任务的状态多次更改。我必须继续点击才能更改图标。

我有什么遗漏吗?对结构的更改可以在页面的另一个区域完美运行。这是我无法正常工作的一个领域。唯一的区别是我切换真/假而不是操纵对象的其他区域。可以使用 angular.copy 设置真/假值有帮助吗?

我有点不知道从这里做什么..

建议?

【问题讨论】:

    标签: javascript angularjs angularjs-scope


    【解决方案1】:

    我相信会有更好的答案,但要尝试的一件事是将您的服务执行包装在 $timeout 中,这会强制进行摘要。

    $timeout(function() {
        $scope.package = SampleService.getPackage();
    });
    

    【讨论】:

    • 同上...似乎不是一个好的答案,但也不起作用。
    • @dferg 如果这两个都不起作用,那么这不是摘要问题。 $timeout 当然会强制进行摘要,这应该会使您的视图更新。没有代码示例,很难知道发生了什么。
    • 理解并同意,这就是为什么它让我如此困惑。想知道它是否只是没有注意到变量是脏的,因为变化有多远。它的几个对象嵌套在其他对象和数组中的几个级别。
    【解决方案2】:

    听起来答案是触发$digest 循环:http://www.sitepoint.com/understanding-angulars-apply-digest/

    这将在您的控制器中产生以下代码:

    $scope.$apply(function () {
        $scope.package = SampleService.getPackage();
    });
    

    【讨论】:

    • 我在想这可能是解决方案,但似乎必须有一些我遗漏的东西会使其无法正确更新。不断触发应用似乎很浪费,而且更像是一个被黑的解决方案。不过这可能是我唯一的一个..我会试试的
    • 有趣。您是否尝试过下面的$timeout 解决方案?那么有没有可能问题不是你认为的那样?
    • 我试过了。它也没有用。我可能会尝试稍微重组这些东西并改变它的显示方式,看看它是否有帮助,因为显示是 3-4 个嵌套的 ng-repeats
    • 在我看来这可能是一个范围界定问题。
    • $scope.$apply() 不会触发摘要周期,如果已经有一个正在进行中的话。最好使用 $timeout() 强制执行摘要循环,因为如果已经有一个在进行中,它不会因错误而失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2016-04-16
    • 2016-10-08
    相关资源
    最近更新 更多