我正在学习Angularjs,以及如何使用templateUrl加载模板。
我有一个简单的指令:
var mainApp = angular.module("mainApp", []);
mainApp.directive("request", function() {
return {
restrict: "E",
scope: {
data: "@"
},
templateUrl: "te.html"
}
})
我尝试使用这样的指令:
<!DOCTYPE html>
<html>
<head>
<script src="js/jquery-2.0.0.js"></script>
<script src="js/angular.js"></script>
<link href="css/bootstrap.css" rel="stylesheet" />
<script src="js/bootstrap.js"></script>
<script src="js/main.js"></script>
<style type="text/css">
div {
background-color: cornflowerblue;
}
#appPanel {
width: 900px;
height: 1000px;
}
</style>
</head>
<body>
<div id="appPanel" ng-app="mainApp" class="container">
<div class="row-fluid" style="height: 15%">
<div class="span12">
title
</div>
</div>
<div class="row-fluid" style="height: 85%">
<div class="span3" style="height: 100%">
actions
</div>
<div class="span9" style="height: 100%" ng-controller="AppCtrl">
<div ng-repeat="request in data.requests">
<request data="request"></request>
</div>
</div>
</div>
</div>
</body>
</html>
打开页面后,我遇到了这个例外:
XMLHttpRequest cannot load file:///Users/chenguangli/Documents/workspace-web/ournotes/te.html. Origin null is not allowed by Access-Control-Allow-Origin. default.html:0
Error: Failed to load template: te.html
at Error (<anonymous>)
at file:///Users/chenguangli/Documents/workspace-web/ournotes/js/angular.js:4503:17
at file:///Users/chenguangli/Documents/workspace-web/ournotes/js/angular.js:8898:11
at wrappedErrback (file:///Users/chenguangli/Documents/workspace-web/ournotes/js/angular.js:6806:57)
at file:///Users/chenguangli/Documents/workspace-web/ournotes/js/angular.js:6882:53
at Object.Scope.$eval (file:///Users/chenguangli/Documents/workspace-web/ournotes/js/angular.js:8011:28)
at Object.Scope.$digest (file:///Users/chenguangli/Documents/workspace-web/ournotes/js/angular.js:7876:25)
at Object.Scope.$apply (file:///Users/chenguangli/Documents/workspace-web/ournotes/js/angular.js:8097:24)
at done (file:///Users/chenguangli/Documents/workspace-web/ournotes/js/angular.js:9111:20)
at completeRequest (file:///Users/chenguangli/Documents/workspace-web/ournotes/js/angular.js:9274:7) js/angular.js:5704
js/angular.js:5704
js/angular.js:4800
wrappedErrback js/angular.js:6808
js/angular.js:6882
Scope.$eval js/angular.js:8011
Scope.$digest js/angular.js:7876
Scope.$apply js/angular.js:8097
done js/angular.js:9111
completeRequest js/angular.js:9274
xhr.onreadystatechange js/angular.js:9244
我没有尝试加载模板文件跨域(te.html与default.html相同)。
有谁可以帮我弄清楚发生了什么?
答案 0 :(得分:71)
问题是您在文件系统上运行示例(使用file://
协议),并且许多浏览器(Chrome,Opera)在使用file://
协议时限制XHR调用。 AngularJS模板通过XHR下载,结合使用file://
协议会导致您获得错误。
在解决这种情况时,你有几个选择:
<script>
指令在您的index.html文件中嵌入模板:http://docs.angularjs.org/api/ng.directive:script,以便使用主HTML文件下载模板,不再需要通过XHR加载它们file://
协议进行XHR呼叫。例如,这可以在Chrome中完成,如下所示:Allow Google Chrome to use XMLHttpRequest to load a URL from a local file 答案 1 :(得分:14)
如果您安装了Node和NPM,请运行: npm install http-server -g
然后导航到包含您应用的文件夹并运行: http-server
我在这篇SO帖子中找到了答案:Quick Node Server
您可以在此处下载节点(NPM附带节点):Node
希望这有帮助!
答案 2 :(得分:3)
Chrome不允许file:
协议上的ajax请求。
请查看:Google Chrome --allow-file-access-from-files disabled for Chrome Beta 8以获得解决方法,或者您可以在计算机上运行Web服务器。
答案 3 :(得分:0)
您还可以使用expressjs Web服务器加载index.html文件。
安装快递服务器
npm install express -S
server.js文件
const express = require('express')
const path = require('path');
const app = express();
通过指定路径加载angularjs文件
注意:假设您的角度文件(模块/控制器/指令文件和index.html文件)位于公共目录中。
app.use(express.static(path.join(__dirname, 'public')));
收听(使用节点server.js启动应用)
app.listen(8080, () => console.log('App listening on port 8080'));
package.json文件
{
"scripts": {
"dev": "node server.js"
},
"dependencies": {
"express": "^4.16.4"
},
}
运行npm run dev
以启动服务器。
public / index.html文件
<!DOCTYPE html>
<html ng-app="mainApp">
<head>
<script src="js/jquery-2.0.0.js"></script>
<script src="js/angular.js"></script>
<link href="css/bootstrap.css" rel="stylesheet" />
<script src="js/bootstrap.js"></script>
<script src="js/main.js"></script>
<style type="text/css">
div {
background-color: cornflowerblue;
}
#appPanel {
width: 900px;
height: 1000px;
}
</style>
</head>
<body>
<div id="appPanel" class="container">
<div class="row-fluid" style="height: 15%">
<div class="span12">
title
</div>
</div>
<div class="row-fluid" style="height: 85%">
<div class="span3" style="height: 100%">
actions
</div>
<div class="span9" style="height: 100%" ng-controller="AppCtrl">
<div ng-repeat="request in data.requests">
<request data="request"></request>
</div>
</div>
</div>
</div>
</body>
</html>