gpt4 book ai didi

javascript - AngularJS Controller As : updating controller field in $interval does not update ng-show

转载 作者:行者123 更新时间:2023-11-27 23:38:33 29 4
gpt4 key购买 nike

我正在使用controllerAs语法,由于某种原因,当在$interval中更新 Controller 的字段时,它无法正确显示/隐藏 View 中的元素。我使用 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'
})
});

我的 Controller :

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);
}
});
});

最后是 View :

<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”属性显示了正确的值。所以,这个表达显然已经被重新评估了。但是,旧的“等待日志...”标题仍然显示,并且第一个 div 未显示(并且它仍然应用了“ng-hide”css 类)。

我在这里缺少什么?

最佳答案

As Ranjith S pointed out in the comment ,问题出在 ng-show 绑定(bind)中!那里不应该有 {{ ... }} 。删除括号解决了问题。

关于javascript - AngularJS Controller As : updating controller field in $interval does not update ng-show,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33911892/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com