AngularJS中使用jQuery.load()加载页面后指令失效的解决咨询
问题分析与解决方案
这是个典型的AngularJS未编译动态加载DOM的问题——你首次通过angular.bootstrap启动Angular时,它只会编译当时存在的DOM元素;而用jQuery的load()方法新加载的HTML内容,Angular根本不知道它们的存在,自然不会解析其中的{{}}表达式。
下面给你两种可行的解决思路,推荐第二种更符合Angular设计理念的方案:
方案1:手动编译动态加载的DOM
利用Angular的$compile服务,在新内容加载完成后手动编译并绑定到作用域:
angular.module('div', []) .controller('divcontroller', ['$scope', '$compile', function ($scope, $compile) { $scope.ConfirmRefresh = function(){ $('#page_content').load(page_url, function() { // 编译page_content内的新DOM,绑定到当前控制器作用域 $compile($('#page_content').children())($scope); // 触发Angular的消化循环,确保表达式生效 $scope.$apply(); }); } }]); angular.element(function() { angular.bootstrap(document, ['div']); });
关键说明:
load()的回调函数会在新内容完全加载后执行,这时候才适合调用$compile$compile会把新DOM转换为Angular可识别的模板,绑定到指定作用域后就能解析表达式$scope.$apply()强制Angular检查作用域变化,更新视图
方案2:改用Angular原生的ng-include(推荐)
放弃jQuery的load(),用Angular自带的ng-include指令来管理模板加载,这是更符合Angular设计思想的做法:
主页面的DOM结构修改:
<div id="page_content" ng-include="currentPageUrl"></div>
控制器代码调整:
angular.module('div', []) .controller('divcontroller', ['$scope', function ($scope) { // 初始化默认页面URL,page_url确保是控制器能访问到的变量 $scope.currentPageUrl = page_url; $scope.ConfirmRefresh = function(){ // 重新赋值URL,ng-include会自动重新加载并编译模板 // 加时间戳是为了避免浏览器缓存旧页面 $scope.currentPageUrl = page_url + '?t=' + new Date().getTime(); } }]); angular.element(function() { angular.bootstrap(document, ['div']); });
优势:
- 完全由Angular接管模板加载和编译,不需要手动处理DOM
- 自动避免了jQuery与Angular DOM操作冲突的问题
- 更易维护,符合Angular的MVVM设计模式
内容的提问来源于stack exchange,提问作者snljais
相关产品推荐
相关产品推荐

