Angularjs不会在ng-view中加载脚本
我有一些特定的视图脚本。 但是,当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 World。 但是,我没有popup一句“你好,约翰”。
任何想法,为什么我不能加载特定于某个视图的脚本?
额外信息 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
被声明)。 换句话说, ngView.link()
就是这样的:
$element.html(template)
所以它归结为如何在jqLite和jQuery中实现html()
。 jqLite使用本地的innerHTML
属性,它只设置内容但不评估脚本。 另一方面,jQueryparsing出所有脚本标签并执行它们(通过构build和附加脚本DOM元素到页面)。
如果我包含需要与视图一起工作的脚本,如何在视图加载时触发它? 我不想包括jQuery和/或分割我的脚本。
要在不加载jQuery的情况下执行<script>
标记,请使用jqLite查找<script>
标记,然后eval
innerHTML
。
app.controller("vm", function($scope, $element) { //FIND script and eval var js = $element.find("script")[0].innerHTML; eval(js); });
PLNKR上的演示
另请参阅AngularJS问题#369 – jqLite应该以与jQuery相同的方式创build元素