我有一些特定于视图的脚本。但是,当angularjs加载视图时,该脚本似乎没有执行。
Index.html
<html> <body ng-app="adminApp"> <div ng-view=""></div> <script src="bower_components/angular/angular.js"></script> <script src="scripts/app.js"></script> <script src="scripts/controllers/main.js"></script> </body> </html>
Main.html- 在ng-view下加载
hello world <script> alert('Hello, John!') </script>
在此示例中,当页面加载时,我看到网站上印有一个基本的hello世界。但是,我没有弹出任何消息说“你好,约翰”。
知道为什么我无法加载特定于某个视图的脚本吗?
额外信息 app.js
'use strict'; angular.module('adminApp', []) .config(function ($routeProvider) { $routeProvider .when('/', { templateUrl: 'views/main.html', controller: 'MainCtrl' }) .otherwise({ redirectTo: '/' }); });
控制器/main.js
'use strict'; angular.module('adminApp') .controller('MainCtrl', function ($scope) { $scope.awesomeThings = [ 'HTML5 Boilerplate', 'AngularJS', 'Karma' ]; });
这就是 jqLite的 工作方式。如果要评估模板中的脚本,请在AngularJS之前添加 jQuery 。如果包含jQuery,则将评估脚本。尝试删除jQuery,您会看到最初观察到的行为。
更新 :由于有人要求在评论中进行详细说明,因此这里是:
当路由匹配时,ngView使用jqLite的(或jQuery的,如果已加载)html()方法设置元素的内容(ngView声明为on)。换句话说,ngView.link()执行以下操作:
ngView
html()
ngView.link()
$element.html(template)
因此,归结为如何html()在jqLite和jQuery中实现。jqLite使用native innerHTML属性,该属性仅设置内容,但不评估脚本。另一方面,jQuery解析出所有脚本标签并执行它们(通过在页面上构造和添加脚本DOM元素)。
innerHTML