【问题标题】:AngularJS controllerAs: updating controller field in $interval does not update ng-showAngularJS controllerAs:更新 $interval 中的控制器字段不会更新 ng-show
【发布时间】:2016-02-27 23:17:37
【问题描述】:

我正在使用 controllerAs 语法,并且由于某种原因,在 $interval 中更新控制器的字段时,它不会正确显示/隐藏视图中的元素。我使用 Angular 的 UI 路由器。

我认为最好用代码来描述问题,所以请原谅代码转储。

我的状态(“refreshLogs”只是一个调用 logService 以获取更新日志的函数):

angular.module('portal')
.config(function ($stateProvider, $urlRouterProvider) {
    $stateProvider
         .state('logs', {
             'abstract': true,
             views: {
                 "@": { template: '<div ui-view></div>' }
             }
         })
        .state('logs.view', {
            url: '/logs/:id',
            resolve: {
                log: function ($stateParams, logService) {
                    return logService.getLog($stateParams.id);
                },
                refreshLog: function ($stateParams, logService) {
                    var id = $stateParams.id

                    var fn = function (id) {
                        return logService.getLog(id)
                    };

                    return function() { return fn(id) }
                }
            },
            templateUrl: '/app/logs/viewlog.html',
            controller: 'logController',
            controllerAs: 'vm'
        })
});

我的控制器:

angular.module('portal.controllers')
.controller('logController', function ($state, log, refreshLog, $scope, $interval) {
    var vm = this;
    vm.log = log;

    vm.refreshTimer = $interval(function () {
        refreshLog().then(function (data) {
            vm.log = data;
        })
    }, 15000);

    $scope.$on("$destroy", function () {
        if (angular.isDefined(vm.refreshTimer)) {
            $interval.cancel(vm.refreshTimer);
        }
    });
});

最后是视图:

<div ng-show="{{ vm.log != null }}">
    <div class="page-header">
        <h1>{{ vm.log.JobType }} ({{ vm.log.JobResult }})</h1>
    </div>

    Parameters: {{ vm.log.JobParameters }}

<pre>{{ vm.log.Content }}</pre>
</div>

<div ng-show="{{ vm.log == null }}">
    <div class="page-header">
        <h1>Waiting for log...</h1>
    </div>
</div>

它会在 DOM 更新中显示“ng-show”值,但不会根据该值显示/隐藏元素。我在 Chrome 中检查了 DOM,我看到了这个(添加星号以强调):

<div ui-view="" class="ng-scope"><div ng-show="**false**" class="ng-binding ng-scope ng-hide">
    <div class="page-header">
        <h1 class="ng-binding"> ()</h1>
    </div>

    Parameters: 

<pre class="ng-binding"></pre>
</div>

<div ng-show="**true**" class="ng-scope">
    <div class="page-header">
        <h1>Waiting for log...</h1>
    </div>
</div></div>

从哪个开始是正确的,并显示正确的 div。几秒钟后,日志被刷新,“vm.log”变量被设置为一个非空值(我知道这是因为我在分配这个值的 JS 代码中设置了一个断点,它看起来是正确的)。之后,我再次检查 DOM 并看到:

<div ui-view="" class="ng-scope"><div ng-show="**true**" class="ng-binding ng-scope ng-hide">
    <div class="page-header">
        <h1 class="ng-binding">...</h1>
    </div>
...
</pre>
</div>

<div ng-show="**false**" class="ng-scope">
    <div class="page-header">
        <h1>Waiting for log...</h1>
    </div>
</div></div>

注意显示正确值的“ng-show”属性。因此,表达式显然已被重新评估。但是,旧的“Waiting for log...”标题仍然显示,第一个 div 没有显示(并且它仍然应用了“ng-hide”css 类)。

我在这里错过了什么?

【问题讨论】:

  • 尝试从 {{ vm.log != null }} 中删除大括号。仅使用 ng-show=" vm.log != null"
  • 就是这样!如此愚蠢,如此简单....非常感谢您指出我相当笨拙的错误!如果您将此作为答案发布,我会将其标记为已回答。
  • 欢迎 :) 很高兴能提供帮助。

标签: javascript angularjs ng-show angularjs-controlleras angularjs-bindings


【解决方案1】:

正如 Ranjith S 在评论中指出的那样,问题出在“ng-show”绑定中!那里不应该有 {{ ... }}。去掉括号解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多