引导后如何激活新的 Angular 控制器
How to activate new Angular controller after bootstrapping
我有一个 Angular 应用程序,它使用带有 ng-app
属性的自动引导。然后,稍后,我在 HTML 模板的 Bootstrap 模态对话框中添加一个 DOM 子树,如下所示:
<!DOCTYPE html>
<html ng-app="Foo">
<head>
<link href="lib/bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen" />
</head>
<body>
<a href="template.html" data-toggle="modal" data-target="#modal">Modal</a>
<div class="modal fade" id="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
</div>
</div>
</div>
<script src="lib/jquery/jquery.js"></script>
<script src="lib/bootstrap/js/bootstrap.js"></script>
<script src="lib/angular.js/angular.js"></script>
</body>
</html>
现在,在模板中,我有一个 div 和一个 ng-controller
属性来将已注册的控制器绑定到它,如下所示:
<div ng-controller="ViewModalController">
</div>
控制器在应用程序中定期注册。
但是,控制器在加载模态后未绑定,我猜是因为 ng-controller
div 在引导过程中不可用。
如何让 Angular 在加载时拾取它?
是的,你是对的。这不起作用,因为它在 Bootstrap 时不存在,并且您正在使用 jQuery 加载新模板,而 Angular 没有编译模板。
为了让事情正常进行,您应该像这样编译新添加的 HTML(在您的控制器之一中执行此操作并注入 $compile
):
$("#modal").on("shown.bs.modal", function() {
var $modal = angular.element(document.getElementById('modal'));
$compile($modal.contents())($scope);
});
在此处查看工作示例:https://plnkr.co/edit/zASHzGwOLxku12Ae5hnP?p=preview
重要
您用来加载模板的远程选项已被弃用并在 Bootstrap 4 中删除。最好不要使用它。
此外,Angular 的 UI 团队已经为 Bootstrap 的 Javascript 功能编写了本机 Angular 代码,因此您不需要与 Angular.
一起使用时的 jQuery 和 bootstrap.js
文件
我有一个 Angular 应用程序,它使用带有 ng-app
属性的自动引导。然后,稍后,我在 HTML 模板的 Bootstrap 模态对话框中添加一个 DOM 子树,如下所示:
<!DOCTYPE html>
<html ng-app="Foo">
<head>
<link href="lib/bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen" />
</head>
<body>
<a href="template.html" data-toggle="modal" data-target="#modal">Modal</a>
<div class="modal fade" id="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
</div>
</div>
</div>
<script src="lib/jquery/jquery.js"></script>
<script src="lib/bootstrap/js/bootstrap.js"></script>
<script src="lib/angular.js/angular.js"></script>
</body>
</html>
现在,在模板中,我有一个 div 和一个 ng-controller
属性来将已注册的控制器绑定到它,如下所示:
<div ng-controller="ViewModalController">
</div>
控制器在应用程序中定期注册。
但是,控制器在加载模态后未绑定,我猜是因为 ng-controller
div 在引导过程中不可用。
如何让 Angular 在加载时拾取它?
是的,你是对的。这不起作用,因为它在 Bootstrap 时不存在,并且您正在使用 jQuery 加载新模板,而 Angular 没有编译模板。
为了让事情正常进行,您应该像这样编译新添加的 HTML(在您的控制器之一中执行此操作并注入 $compile
):
$("#modal").on("shown.bs.modal", function() {
var $modal = angular.element(document.getElementById('modal'));
$compile($modal.contents())($scope);
});
在此处查看工作示例:https://plnkr.co/edit/zASHzGwOLxku12Ae5hnP?p=preview
重要
您用来加载模板的远程选项已被弃用并在 Bootstrap 4 中删除。最好不要使用它。
此外,Angular 的 UI 团队已经为 Bootstrap 的 Javascript 功能编写了本机 Angular 代码,因此您不需要与 Angular.
一起使用时的 jQuery 和bootstrap.js
文件