【问题标题】:Angular app only shows adjusted dynamic content after refreshAngular 应用仅在刷新后显示调整后的动态内容
【发布时间】:2015-09-18 21:15:47
【问题描述】:

我正在使用服务(工厂)在服务器端访问我的数据,我正在使用$routeParams 将 id 包含到对服务器的请求中。这一切都很好,但只是我第一次运行程序时,这是我的一些代码:

我的控制器:

klusplan.success(function(data) {
    console.log("onsucces",data);
    $scope.klusplan = data[0];
    $scope.klusplan.duratie = localStorage.getItem('Duration');
    $scope.klusplan.orderId = localStorage.getItem('klusplan');
    var tijdInUren = localStorage.getItem('Duration').split(":");
    var Uren = tijdInUren[0];
    var Minuten = tijdInUren[1];
    Uren = Uren + (Minuten / 60);

    $scope.klusplan.kosten = ($scope.klusplan.vm_kl_tarief * Uren);
});

我的服务:

 app.factory('klusplan', ['$http', '$routeParams', function($http, $routeParams) {
return $http.get('http://localhost:8080/getdata/klusplan.php?id='+$routeParams.klplan_id)

.success(function(data, status) {
    console.log("succes", data, status);
    return data;
})
.error(function(err) {
    return err;
}); 
}]);

最后但并非最不重要的路线

.when('/klusplan/:klplan_id', {
        controller: 'KlusplanController',
        templateUrl: 'views/klusplan.html'
    })

我已经尝试过一些类似的方法:

$httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';

app.run(function($rootScope, $templateCache) {
$rootScope.$on('$routeChangeStart', function(event, next, current) {
        console.log("event: ", event," next: ", next," current: ", current)
        $templateCache.remove(current.templateUrl);
});
});

现在,当我第二次运行我的应用程序时,voodoo 全部启动,而不是从服务器获取数据,http 请求永远不会触发。相反,它会显示我上次运行时收集的数据。

我将不胜感激。

【问题讨论】:

  • 如果你按下 cmd+Shift+R 会发生什么?也许 Chrome 正在缓存你的 http 调用。
  • 我会尝试在您的服务器调用 url($http.get(...))中添加一个随机值,以排除协议缓存...

标签: javascript angularjs http caching


【解决方案1】:

您正在直接调用klusplan.success 函数。所以你总是会得到已经获取的数据。

如果你这样写工厂:

app.factory('klusplan', ['$http', '$routeParams', function($http, $routeParams) {
  return { 
    getData: function() { 
      return $http.get('http://localhost:8080/getdata/klusplan.php?id='+$routeParams.klplan_id);
    }
  };
}]);

然后在控制器内部:

klusplan.getData().then(function(data) { ...

因此您每次都调用$http.get 并从服务器获取新数据,而不仅仅是已经成功获取的数据。

【讨论】:

  • 当然!目前不在我的办公桌前,但我已经在其他地方以这种方式实现了它,谢谢!
  • 几乎,您必须使用 $q 才能获得延迟结果集。我进行了编辑,但您拒绝了它:/
  • 我看到你的延迟,但你实际上并不需要它。这个概念被反复提出。在极少数情况下,只需使用您自己的 $q.deferred 即可。你 $http.get 将返回一个承诺,你可以用它调用 .then()
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 2015-12-22
  • 2022-01-08
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
相关资源
最近更新 更多