【问题标题】:How to retrigger ng-if / ng-show animation when using $http cache使用 $http 缓存时如何重新触发 ng-if / ng-show 动画
【发布时间】:2016-04-11 03:49:30
【问题描述】:

在工厂服务中,我必须使用

$http.get(url, { 缓存: true })

在我看来,我正在使用 ng-ifng-show 来触发 CSS 过渡。


问题:

第一个请求效果很好,但显然对于相同服务功能的下一个请求,动画不会重新触发。

有没有办法重置/重新触发 ng-if / ng-show 动画?

(需要缓存,这样我可以避免等待时间,但我仍然需要在不同状态之间触发不透明动画)。

谢谢!


app.factory('progService', function ($http) {
    var progService= {};
    progService.getProgram = function() {
        return $http.get(appInfo.api_url + 'pages/5', { cache: true});
    };
    return progService;
});


app.controller('programController', function($scope, progService) {
    progService.getProgram().then(function(res){
        $scope.program = res.data;
    });
});


<div ng-if="program.aJsonKey"></div>

【问题讨论】:

  • 这里有点混乱,如果要缓存请求结果,为什么要触发ng-if动画呢?你能描述一下这个动画是做什么的吗?
  • 还有program.acf.exerpt是什么?
  • @ZhiliangTakutoXing 问题已更新。如果您可以投票赞成这个问题,那就太好了。谢谢!

标签: javascript angularjs ng-show angular-http angular-ng-if


【解决方案1】:

您的视图未更新,因为您传递的是相同的缓存对象。 为了执行 ngIf 的 $watcher,您应该提供一个“新鲜”/新对象。您可能还需要更改状态,因为 ngIf 会期望 true 或 false。 所以在你的情况下应该是这样的:

app.controller('programController', function($scope, progService) {
    $scope.program = null;
    progService.getProgram().then(function(res){
        $scope.program = angular.copy(res.data); // Returns a copy of the object. Always a new object!
    });
});

【讨论】:

  • 谢谢雅沃尔。但是,如果我在 $scope.program = angular.copy(res.data); angular.element(document).ready(function () { + }); 周围放置一个简短的 setTimout ,动画只会重新触发。 但是对于这两种技巧来说,第一个请求似乎要长得多。
  • 你应该避免在 Angular 中使用 setTimeout。它有一个抽象,称为 $timeout 服务,您应该使用它而不是纯 setTimeout:docs.angularjs.org/api/ng/service/$timeout 而且,是的,如果您的服务被模拟/不进行 AJAX 调用,您可能不会得到动画,因为您有同步码。使用超时显示动画应该可以触发动画
  • 从你的文章中我也看到它的 DOM 可能还没有准备好。所以解决方法是使用 .ready() 或 $timeout/setTimeout。
  • 确实...由于在页面上使用了额外的滑块,我遇到了其他问题。所以 .ready() 或 setTimeout 都不能很好地工作(有时等待另一个滑块实现幻灯片转换)......现在我正在使用 $timeout 更好,但并不完美(有时它仍然发生得太早)。但是我对$timeout了解不多,我想我以后会更好地利用它。
【解决方案2】:

在这种情况下,您可能需要设置自己的标志。例如:

app.controller('programController', function($scope, progService) {

    $scope.programDisplay = false;

    progService.getProgram().then(function(res){
        $scope.program = res.data;
        angular.element(document).ready(function () { 
            $scope.programDisplay = true;
        });
    });
});

然后

<div ng-if="program.acf.exerpt && programDisplay"></div>

【讨论】:

  • 好吧,它终于可以工作了,但只有我在$scope.programDisplay = true; 周围设置了一个setTimeout,即使是1 毫秒。 !!谢谢!
  • 如果不使用setTimeout,当它不工作时会是什么样子?你能描述一下吗?
  • 如果我不使用 setTimeout,似乎标志始终为真(来自第二个请求),从不为假,因此不会重新触发动画。放置一个毫秒的差距会有所不同...... Yavor Ivanov 的另一个答案也需要同样的技巧
  • 我的猜测是,$scope.programDisplay 在 bowser 实际处理整个 html 文档之前就已经解决了。那么试试angular.element(document).ready(function () { $scope.programDisplay = true; });
  • 这是最好的答案。谢谢你。我会编辑你的答案。一旦获得批准,我会将其设置为接受的答案。
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
相关资源
最近更新 更多