检查 $routeProvider 模板中的 ng-include 文件是否存在
Check if file exists for ng-include in $routeProvider template
我已经设置了 Angular 路由以使用 URL 中的 slug 来确定要加载的文件。它看起来像这样:
$routeProvider.when("/project/:slug", {
controller: "ProjectController",
template: function($routeParams){
return '<div id="project" ng-include="\'/views/' + $routeParams.slug + '.html\'"></div>';
}
});
很有用,但如果 ng-include
的文件不存在,这里没有回退。我考虑过使用 resolve,但我似乎无法正确检查文件。我的尝试是这样的:
$routeProvider.when("/project/:slug", {
controller: "ProjectController",
resolve: {
check: ["$route", "$http", "$location", function($route, $http, $location){
$http.get("/views/" + $route.current.params.slug + ".html").then(function(res){
if (!res.data) $location.path("/");
else return true;
});
});
},
template: function($routeParams){
return '<div id="project" ng-include="\'/views/' + $routeParams.slug + '.html\'"></div>';
}
});
可能值得注意的是,这是 MEAN 堆栈上单页应用程序的一部分。我在 NodeJS 中设置了 Express 路由,如下所示:
app.get("*", function(req, res){ res.sendFile(__dirname + "/public/index.html"); });
您可以 return 来自 resolve 函数的承诺。您的示例当前触发请求,然后 returns undefined
.
下面的我没有测试过,不过应该return一个promise。 (当请求失败或响应中的 data
属性 为假时,此承诺将失败。
$routeProvider.when("/project/:slug", {
controller: "ProjectController",
resolve: {
check: ["$route", "$http", "$q", function($route, $http, $q){
return $http.get("/views/" + $route.current.params.slug + ".html")
.then(function(res){
if (!res.data) {
return $q.reject('No data');
}
return $q.resolve('Found');
});
}];
},
template: function($routeParams){
return '<div id="project" ng-include="\'/views/' + $routeParams.slug + '.html\'"></div>';
}
});
对于承诺被拒绝的情况。 (请求失败或没有数据)您可以订阅 $routeChangeError
事件来处理这种情况,并将浏览器定位到 /
路由。
原来这个问题是因为我将所有文件请求路由到我的 NodeJS 中的 index.html。因此,当我尝试调用 $http 来检查 .html 视图是否存在时,它总是返回 index.html,因此为真。 Node中的解决方案如下:
app.use(express.static(__dirname + "/public", { maxAge: 86400000 }));
app.get("/framework/*",function(req,res){ res.sendFile(__dirname + "/public" + req.path); });
app.get("/views/*",function(req,res){ res.sendFile(__dirname + "/public" + req.path); });
app.get("*", function(req, res){ res.sendFile(__dirname + "/public/index.html"); });
然后我可以像这样在 Angular 路由中使用解析:
$routeProvider.when("/projects/:slug", {
controller: "ProjectController",
resolve: {
check: ["$route", "$http", "$location", function($route, $http, $location){
return $http.get("/views/" + $route.current.params.slug + ".html").success(function(res){
return true;
}).error(function(res){
return $location.path("/");
});
}]
},
template: function($routeParams){
return '<div id="project" ng-include="\'/views/' + $routeParams.slug + '.html\'"></div>';
}
});
所以这个问题特定于单页应用程序设置。
我已经设置了 Angular 路由以使用 URL 中的 slug 来确定要加载的文件。它看起来像这样:
$routeProvider.when("/project/:slug", {
controller: "ProjectController",
template: function($routeParams){
return '<div id="project" ng-include="\'/views/' + $routeParams.slug + '.html\'"></div>';
}
});
很有用,但如果 ng-include
的文件不存在,这里没有回退。我考虑过使用 resolve,但我似乎无法正确检查文件。我的尝试是这样的:
$routeProvider.when("/project/:slug", {
controller: "ProjectController",
resolve: {
check: ["$route", "$http", "$location", function($route, $http, $location){
$http.get("/views/" + $route.current.params.slug + ".html").then(function(res){
if (!res.data) $location.path("/");
else return true;
});
});
},
template: function($routeParams){
return '<div id="project" ng-include="\'/views/' + $routeParams.slug + '.html\'"></div>';
}
});
可能值得注意的是,这是 MEAN 堆栈上单页应用程序的一部分。我在 NodeJS 中设置了 Express 路由,如下所示:
app.get("*", function(req, res){ res.sendFile(__dirname + "/public/index.html"); });
您可以 return 来自 resolve 函数的承诺。您的示例当前触发请求,然后 returns undefined
.
下面的我没有测试过,不过应该return一个promise。 (当请求失败或响应中的 data
属性 为假时,此承诺将失败。
$routeProvider.when("/project/:slug", {
controller: "ProjectController",
resolve: {
check: ["$route", "$http", "$q", function($route, $http, $q){
return $http.get("/views/" + $route.current.params.slug + ".html")
.then(function(res){
if (!res.data) {
return $q.reject('No data');
}
return $q.resolve('Found');
});
}];
},
template: function($routeParams){
return '<div id="project" ng-include="\'/views/' + $routeParams.slug + '.html\'"></div>';
}
});
对于承诺被拒绝的情况。 (请求失败或没有数据)您可以订阅 $routeChangeError
事件来处理这种情况,并将浏览器定位到 /
路由。
原来这个问题是因为我将所有文件请求路由到我的 NodeJS 中的 index.html。因此,当我尝试调用 $http 来检查 .html 视图是否存在时,它总是返回 index.html,因此为真。 Node中的解决方案如下:
app.use(express.static(__dirname + "/public", { maxAge: 86400000 }));
app.get("/framework/*",function(req,res){ res.sendFile(__dirname + "/public" + req.path); });
app.get("/views/*",function(req,res){ res.sendFile(__dirname + "/public" + req.path); });
app.get("*", function(req, res){ res.sendFile(__dirname + "/public/index.html"); });
然后我可以像这样在 Angular 路由中使用解析:
$routeProvider.when("/projects/:slug", {
controller: "ProjectController",
resolve: {
check: ["$route", "$http", "$location", function($route, $http, $location){
return $http.get("/views/" + $route.current.params.slug + ".html").success(function(res){
return true;
}).error(function(res){
return $location.path("/");
});
}]
},
template: function($routeParams){
return '<div id="project" ng-include="\'/views/' + $routeParams.slug + '.html\'"></div>';
}
});
所以这个问题特定于单页应用程序设置。