调用PHP文件后AngularJS功能失效问题求助
我帮你排查下,这种单独运行正常、组合后失效的情况,大概率是AngularJS的初始化和版本冲突问题,结合你提供的header.php代码,主要有这两个核心问题:
1. 多个AngularJS版本冲突
你在header.php里加载了两个不同版本的AngularJS:
<script data-require="angular.js@*" data-semver="1.6.9" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.7/angular.js"></script> <!--This version is for title attribute--> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.js"></script>
后加载的1.2.9版本会完全覆盖前一个1.3.7版本的全局angular对象,导致Angular的内部环境混乱,后续的模块和控制器无法正常初始化。
2. 多个ng-app指令冲突
AngularJS默认只会自动初始化页面中第一个ng-app指令,你在header.php里多次使用ng-app(比如rootApp、firstApp、thirdApp等),当页面加载时,只有第一个ng-app="rootApp"会被初始化,其他所有ng-app(包括create_test.php里的)都不会被Angular识别,自然就失效了。
具体解决方案
步骤1:清理重复的AngularJS引入
只保留一个稳定版本的AngularJS,建议用你标注的1.6.9版本,替换掉两个重复的引入:
<!-- 只保留一个AngularJS版本 --> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.9/angular.min.js"></script>
步骤2:统一页面的ng-app根模块
把ng-app放到页面的根元素(比如<html>或<body>)上,整个页面只保留一个根模块,比如命名为merahkeeApp:
<body style="padding-top:80px;" ng-app="merahkeeApp">
然后删除所有元素上的ng-app属性,只保留ng-controller。比如原来的:
<a ng-app = "firstApp" ng-controller = "firstController" class="navbar-brand" href="#">{{ pageTitle }}</a>
改成:
<a ng-controller = "firstController" class="navbar-brand" href="#">{{ pageTitle }}</a>
同理,把header.php里其他元素的ng-app属性全部删除。
步骤3:合并所有模块到根模块
修改你的header.js,把原来分散的多个小模块(firstApp、thirdApp等)合并到根模块merahkeeApp下,统一注册所有控制器:
// 初始化根模块 var app = angular.module('merahkeeApp', []); // 注册firstController到根模块 app.controller('firstController', function($scope) { $scope.pageTitle = "Merahkee Technology Soluctions"; // 其他原有逻辑 }); // 注册thirdController到根模块 app.controller('thirdController', function($scope) { $scope.Project = "Projects"; // 其他原有逻辑 }); // 注册fourController到根模块 app.controller('fourController', function($scope) { $scope.Test = "Tests"; // 其他原有逻辑 }); // 继续把其他控制器(seventhController、eighthController等)都注册到这个根模块
步骤4:适配create_test.php的Angular代码
在create_test.php中,把你的控制器注册到已有的merahkeeApp模块(注意不要加[],否则会创建新模块):
// 在create_test.php的脚本中 angular.module('merahkeeApp') // 引用已存在的根模块 .controller('CreateTestController', function($scope) { // 这里写你create_test页面的Angular逻辑 });
同时确保create_test.php里的HTML元素只使用ng-controller,不要加ng-app。
这样调整后,整个页面的Angular环境就统一了,header.php和create_test.php的控制器都会在同一个根模块下正常工作,不会再出现失效的情况。
内容的提问来源于stack exchange,提问作者Vidya

