怎么排查?)
AngularJS 报 ng:btstrpdApp Already Bootstrapped with this Element怎么排查【免费下载链接】angular.jsAngularJS - HTML enhanced for web apps!项目地址: https://gitcode.com/gh_mirrors/an/angular.jsAngularJS 页面加载时或在测试代码里调用angular.bootstrap时抛出[ng:btstrpd]异常含义是你在一个已经完成引导bootstrap的元素上再次调用了angular.bootstrap。官方错误文档 ng:btstrpd 给出了这个错误的三种成因本文按这三个成因逐一说明如何核对、如何修复并附上 Bootstrap 指南 中的正确写法用于验证。报错时机异常在什么条件下抛出先看 bootstrap 的实现src/Angular.js进入引导流程后第一步就检查目标元素是否已经带有 injector有则直接抛错if (element.injector()) { var tag (element[0] window.document) ? document : startingTag(element); // Encode angle brackets to prevent input from being sanitized to empty string #8683. throw ngMinErr( btstrpd, App already bootstrapped with this element \{0}\, tag.replace(//,lt;).replace(//,gt;)); }这意味着报错信息本身就指明了冲突位置信息里是某个元素的起始标签如div ...说明冲突发生在该元素上信息里是document说明冲突发生在html/document 这一层。仓库单测 test/AngularSpec.js 中的断言与之一致对同一元素两次调用angular.bootstrap会抛出包含该元素标签的错误先引导html再bootstrap(document)则抛出App Already Bootstrapped with this Element document。据此下面三个方向都来自官方错误文档和 Bootstrap 指南可逐一核对。排查一ng-app 与 angular.bootstrap 同时使用错误文档指出这是最常见的成因“This usually happens when you accidentally use bothng-appandangular.bootstrapto bootstrap an application.” 文档给出的示例html ... body ng-appmyApp script angular.bootstrap(document.body, [myApp]); /script /body /htmlng-app会让 AngularJS 在DOMContentLoaded时自动引导之后脚本里的手动angular.bootstrap就是对同一元素的第二次引导于是抛错。核对方法在页面源码中同时搜索ng-app和angular.bootstrap如果两者都存在且作用于同一元素就保留其中一种方式。保留自动初始化删掉手动angular.bootstrap调用。按指南的推荐写法把ng-app放在应用根节点通常是html标签angular.js的 script 标签放在页面底部!doctype html html ng-appoptionalModuleName body I can add: {{ 12 }}. script srcangular.js/script /body /html其中ng-app引号内是可选值填写你已定义的应用模块名不指定则引导无模块应用。指南建议在ng-app同一元素上加ng-strict-di指令确保所有服务都做了正确的依赖注入标注。保留手动引导删掉ng-app。指南中有一条明确警告手动引导时不要使用 ng-app 指令You should not use the ng-app directive when manually bootstrapping your app.。指南给出的完整手动引导示例如下script标签的src指向你实际放置angular.js的位置!doctype html html body div ng-controllerMyController Hello {{greetMe}}! /div script srcangular.js/script script angular.module(myApp, []) .controller(MyController, [$scope, function ($scope) { $scope.greetMe World; }]); angular.element(function() { angular.bootstrap(document, [myApp]); }); /script /body /html注意指南对手动引导的两条约束angular.bootstrap不会自动创建模块传入的模块必须事先用angular.module定义好且必须在模块加载或定义完成之后再调用angular.bootstrap()。排查二html上的 ng-app 与 angular.bootstrap(document) 冲突错误文档特别提示就引导而言html元素与document是同一个所以下面这种写法同样会抛错html ... script angular.bootstrap(document, [myApp]); /script /html也就是说如果ng-app写在html上指南推荐的自动初始化写法而某段脚本又调用了angular.bootstrap(document, [...])报错信息会显示document。核对方法当报错信息为App Already Bootstrapped with this Element document时在代码中查找angular.bootstrap(document或documentElement的调用然后按排查一的方式二选一要么去掉html上的ng-app要么去掉这处手动引导调用两者不能并存。排查三angular.js 被引入了两次错误文档给出的第三种成因AngularJS 本身被加载了不止一次。文档示例html ng-app head script srcangular.js/script ... /head body ... script srcangular.js/script /body /html核对方法检查最终渲染出的页面包括模板输出的子页、构建产物中script src...angular...出现了几次只保留一个。指南说明了文件选择与位置开发、调试用angular-[version].js人类可读的版本生产用angular-[version].min.js压缩混淆的版本script 标签放在页面底部避免angular.js的加载阻塞 HTML 解析。验证修复修复后重新加载页面不再抛出[ng:btstrpd]angular.bootstrap正常执行并返回该应用的 injector实现 中bootstrap的返回值就是injector。若改为自动初始化可用指南中的最小自动初始化示例核对html ng-app加底部 script 标签的页面加载后示例中的I can add: {{ 12 }}.应正常渲染而不是停留在模板原文且不再出现该异常。在单元测试中仓库 AngularSpec.js 展示了针对该异常的断言写法例如toThrowMinErr(ng, btstrpd, /App Already Bootstrapped with this Element document/i)可用于确认“错误是否确实由二次引导触发”修复后第二次angular.bootstrap不应再命中该异常。边界ng-app自动与angular.bootstrap手动是两条互斥的初始化路径指南明确禁止在手动引导时保留ng-app——这是本错误最主要的来源。一页中可以引导多个 AngularJS 应用但指南说明该场景没有被积极测试复杂应用下可能出问题需要谨慎。【免费下载链接】angular.jsAngularJS - HTML enhanced for web apps!项目地址: https://gitcode.com/gh_mirrors/an/angular.js创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考