我有一个包含2个视图\ controller的应用程序:
app.config(function ($routeProvider, $locationProvider)
{
$routeProvider
.when("/", {
templateUrl: "/vw/managment",
controller: 'managment-ctrl'
})
.when("/add", {
templateUrl: "/vw/add",
contoller: 'add-ctrl'
})
.otherwise({
controller: function ()
{
window.location.replace('/errors/filenotfound');
},
template: "<div></div>"
});
$locationProvider.html5Mode(true);
});
路径/
是我的&#34;主页&#34;它显示了DB中的项目列表。在此页面中,用户有按钮&#34;添加&#34;将页面重定向到/add
。 &#39;添加&#39;页面允许用户从DB添加项目。用户正在选择项目并单击&#34;保存&#34;。 &#34; Save&#34;按钮将项目保存到数据库并重定向回&#34;主页&#34;。
$scope.save = function()
{
// Save login...
$location.path("/");
};
更改位置路径后,视图将更改为&#34;主页&#34;但在添加新项目之前仍然显示项目。刷新页面将解决问题,但当然不是解决方案......
我猜主页视图正在从缓存中加载。我想强制角度刷新视图。
怎么做?
谢谢。
答案 0 :(得分:4)
提供save()函数的完整代码,以帮助我们找出问题。我认为问题是由于您在调整路由状态时正在调用保存数据的异步调用。因此,您可以在异步休息调用的回调函数中包装位置更改调用。
您应该执行以下操作:
set.seed(10)
n <- 100
x <- data.frame(A = c(rnorm(n, 5, 2), rnorm(n, 10, 2)),
B = c(rep("yes", n), rep("no", n)))
ggplot(data = x, aes(x = A, fill = B))+
geom_histogram()+
scale_fill_manual(values=c("blue", "red"))
# Re-order levels:
x$B <- factor(x$B, levels = c("yes", "no"))
# Plot again
ggplot(data = x, aes(x = A, fill = B))+
geom_histogram()+
scale_fill_manual(values=c("red", "blue"))
答案 1 :(得分:3)
我在this question找到了一些答案,这可能对您有用。您可以完全禁用缓存,因此始终从cdn / server获取响应。
执行此操作的一种方法是通过修改请求中的缓存控制标头,以便您的浏览器不会缓存请求。
app.config(['$httpProvider', function($httpProvider) {
if (!$httpProvider.defaults.headers.common) {
$httpProvider.defaults.headers.common = {};
}
$httpProvider.defaults.headers.common["Cache-Control"] = "no-cache";
$httpProvider.defaults.headers.common.Pragma = "no-cache";
$httpProvider.defaults.headers.common["If-Modified-Since"] = "0";
}]);
另一种方法是禁用特定资源上的缓存,在这种情况下是模板,所以只需将这些缓存添加到模板的html文件中的标题中。
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">
答案 2 :(得分:2)
尝试在路径参数中使用cache: false
以避免角度缓存视图。我希望这会对你有所帮助。
app.config(function ($routeProvider, $locationProvider)
{
$routeProvider
.when("/", {
templateUrl: "/vw/managment",
cache: false,
controller: 'managment-ctrl'
})
.when("/add", {
templateUrl: "/vw/add",
contoller: 'add-ctrl'
})
.otherwise({
controller: function ()
{
window.location.replace('/errors/filenotfound');
},
template: "<div></div>"
});
$locationProvider.html5Mode(true);
});
答案 3 :(得分:2)
您可以使用$route
服务重新加载。您可以在重定向后注入此服务并使用重新加载功能。 $route.reload();
如果要执行完全刷新,可以注入$window
并使用:
$scope.save = function()
{
// Save login...
$location.path("/");
$route.reload();
};
&#13;
$scope.save = function()
{
// Save login...
$location.path("/");
$window.location.reload();
};
&#13;
答案 4 :(得分:1)
当您的示波器未正确加载时,它会发生,因此您也可以使用 $范围。$申请()
$http.post("url to save").then(function(result) {
//your logic after save
$location.path("/");
$scope.$apply();
});
最好使用$state.go
您可以阅读有关$scope.$apply()
的更多信息答案 5 :(得分:0)
很难从您的描述中了解缓存发生的位置。如果您查看chrome的网络选项卡,您可以看到您的应用程序是否在路由加载时从服务器重新获取数据,您可以看到服务器正在发回的内容。这将告诉您问题是应用程序是在服务器完成保存之前获取数据,还是根本不重新获取数据。
Angular服务是单例,因此它们只会初始化一次。通常,要遵循的好模式是在控制器中,告诉服务再次获取它的数据。这样,当路由加载时,控制器就会进入,并且每次都会获取新数据。