gpt4 book ai didi

javascript - 使用 javascript 和 AngularJS 检测重写规则后面是否存在资源

转载 作者:行者123 更新时间:2023-11-28 02:10:58 25 4
gpt4 key购买 nike

我正在尝试仅使用 javascript 和 AngularJS 覆盖我的单页应用程序的部分内容。

覆盖基于子域。

每个子域都指向同一个文档根。

controllers.js

controller('AppController', ['$scope','$route','$routeParams','$location', function($scope, $route, $routeParams, $location) {    
$scope.$on("$routeChangeSuccess",function( $currentRoute, $previousRoute ){
render();
});
var render = function(){
//Is it actually a subdomain?
if($location.host().split(".",1).length>2){
//Use subdomain folder if it is.
var url = "views/"+$location.host().split(".",1)+"/"+$route.current.template;
var http = new XMLHttpRequest();
http.onreadystatechange=function(){
if (http.readyState==4){
//If there isn't an overwrite, use the original.
$scope.page = (http.status!=404)?url:("views/"+$route.current.template);
}
}
http.open('HEAD', url, true);
http.send();
}
else{
//Else we are on the parent domain.
$scope.page = "views/"+$route.current.template;
}
};
}])

config.js

config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$routeProvider.when('/', {
template: 'home.html'
});
$routeProvider.when('/services', {
template: 'services.html'
});
$routeProvider.otherwise({redirectTo: '/'});
}]);

index.html

<html lang="en" ng-app="myApp" ng-controller="AppController">
<body>
<div ng-include src="page" class="container"></div>
</body>
</html>

因为这是一个单页应用,所以当您直接点击 URL 时,将会出现 404。这就是我们在服务器上应用重写规则的原因。就我而言,我使用的是 nginx:

location / {
try_files $uri /index.html;
}

当我不在子域上时,这非常有用,但我也没有发送 XMLHttpRequest。当我确实使用子域时,现在我们需要检查是否覆盖。

这里棘手的部分是重写规则强制 XMLHttpRequest 返回 200。

关于如何鱼与熊掌兼得的想法?

最佳答案

我决定采用本地策略有两个原因:

  1. XML 请求没有额外的开销。
  2. 当资源不存在时,404 消息不会污染控制台日志。

services.js

factory('Views', function($location,$route,$routeParams,objExistsFilter) {

var viewsService = {};
var views = {
subdomain1:{
'home.html':'/views/subdomain1/home.html'
},
subdomain2:{

},
'home.html':'/views/home.html',
};

viewsService.returnView = function() {
var y = $route.current.template;
var x = $location.host().split(".");
return (x.length>2)?(objExistsFilter(views[x[0]][y]))?views[x[0]][y]:views[y]:views[y];
};

viewsService.returnViews = function() {
return views;
};

return viewsService;
}).

controllers.js

controller('AppController', ['$scope','Views', function($scope, Views) {    
$scope.$on("$routeChangeSuccess",function( $currentRoute, $previousRoute ){
$scope.page = Views.returnView();
});
}]).

filters.js

filter('objExists', function () {
return function (property) {
try {
return property;
} catch (err) {
return null
}
};
});

关于javascript - 使用 javascript 和 AngularJS 检测重写规则后面是否存在资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17095989/

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