(十) ng-inlude指令加载页面失败的原因和解决方法

AngularJS中ng-include指令使用详解
本文介绍AngularJS中ng-include指令的作用及使用方法,并解释在本地环境中遇到的跨域问题及其解决方案。

angularjs中提供的ng-include指令,很类似于JSP中的<jsp:include>用来将多个子页面合并到同一个父页面中,避免父页面过大,可读性差,不好维护。

父页面parent.html代码如下:

<html>
  <head>
    <script src="angular-1.2.2/angular.js"></script>
	<script>
	 function rootController($scope,$rootScope,$injector)
	 {
		$rootScope.name = "aty";
		$rootScope.age = 25;
	 }
	</script>
  </head>
  <body  ng-app ng-controller="rootController">
        <h1>Hello, {{name}}!</h1>
        <h1>Hello, {{age}}!</h1>
	
	<div id="included" ng-include="'child.html'">
            <input type="button" value="2"/>
        </div>
  </body>
</html>

被包含的子页面child.html代码如下:

 <div>
        <h1>included, {{name}}!</h1>
        <h1>included, {{age}}!</h1>
 </div>


我用IE11和Chrome39运行parent.html,发现child.html页面不能包含到parent.html中。IE下报错信息如下:

Error: 拒绝访问。
   at Anonymous function (file:///D:/learn/angular-1.2.2/angular.js:7852:7)
   at sendReq (file:///D:/learn/angular-1.2.2/angular.js:7720:9)
   at serverRequest (file:///D:/learn/angular-1.2.2/angular.js:7454:9)

chrome下报错信息如下:

XMLHttpRequest cannot load file:///D:/learn/include.html. 
Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'file:///D:/learn/include.html'.


IE下的提示有些晦涩,不过chrome提示很明显:不能跨域访问。通过上面的错误提示,可以看到:使用ng-include指令的时候,会用到AJAX请求XMLHttpRequest。但是我们是直接用浏览器打开的parent.html,并没有通过web容器访问,所以存在跨域访问问题,加载child.html也就失败了。解决办法很简单:将代码部署到tomcat等web容器下,通过http访问即可。


平时在练习javascript或者是JS框架的时候,一版都是使用比较轻量级的工具,不会使用像Eclipse之类IDE,我一般使用Notepad++编写js代码。Notepad++可以方便地调用本机安装的浏览器。像ng-include这样的指令,必须要有web容器的支持。可以使用前端开发神器webstorm,该工具运行html的时候,会自动启动内置的web容器,这样ng-include指令就不会报错了。 

 

 

 


 

### 头文件源文件的编写方式 在 C/C++ 项目中,通常将头文件(`.h`)放在 `include/` 目录中,源文件(`.c` 或 `.cpp`)放在 `src/` 目录中。头文件用于声明函数、宏、结构体、类等接口信息,而源文件则实现具体的逻辑代码。 #### 头文件的编写 头文件应包含必要的函数声明、宏定义、结构体定义、类型定义等。为了防止重复包含,每个头文件都应使用预处理宏保护。 例如,`include/task1.h`: ```c #ifndef TASK1_H #define TASK1_H void task1_init(void); void task1_run(void); #endif // TASK1_H ``` 该头文件定义了两个函数声明,供其他源文件调用。使用 `#ifndef`、`#define` `#endif` 来防止重复包含,确保每个头文件只被包含一次[^1]。 #### 源文件的编写 源文件负责实现头文件中声明的函数。例如,`src/task1.c`: ```c #include "task1.h" #include <stdio.h> void task1_init(void) { printf("Task1 initialized\n"); } void task1_run(void) { printf("Task1 running\n"); } ``` 注意源文件中包含对应的头文件,并实现其声明的函数。在多模块项目中,每个模块应保持独立,避免耦合。 ### Makefile 的存放位置与编写方式 Makefile 通常应放在项目根目录下,与 `src/`、`include/`、`bin/`、`obj/` 等目录并列。这种结构有助于统一管理编译流程,并保持项目结构清晰。 #### 示例目录结构 ``` project/ ├── src/ │ ├── task1.c │ ├── task2.c │ └── task3.c ├── include/ │ ├── task1.h │ ├── task2.h │ └── task3.h ├── bin/ ├── obj/ ├── Makefile └── .gitignore ``` #### Makefile 示例 ```makefile CC = gcc CFLAGS = -Wall -Wextra -g -Iinclude SRC = src/task1.c src/task2.c src/task3.c OBJ = $(SRC:.c=.o) BIN = bin/app all: $(BIN) $(BIN): $(OBJ) $(CC) $(CFLAGS) $^ -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJ) $(BIN) ``` 该 Makefile 使用 `-Iinclude` 参数指定头文件搜索路径,使得源文件可以直接使用 `#include "task1.h"` 等形式包含头文件。所有目标文件生成在当前目录下或 `obj/` 目录中,最终链接生成的可执行文件放在 `bin/` 目录中[^1]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值