Html AngularJS动态添加到页面
我们在电子浏览器中有一个AngularJS SP应用程序(智能镜像),它具有用户可创建的扩展 这些扩展是使用角度指令的html小片段 并使用控制器和服务 要安装扩展,必须编辑主页并插入控制器和服务功能的脚本标记,以及HTML片段的Html AngularJS动态添加到页面,html,angularjs,Html,Angularjs,我们在电子浏览器中有一个AngularJS SP应用程序(智能镜像),它具有用户可创建的扩展 这些扩展是使用角度指令的html小片段 并使用控制器和服务 要安装扩展,必须编辑主页并插入控制器和服务功能的脚本标记,以及HTML片段的 硬编码这个单页应用程序工作得很好 但是我想在这个应用程序(开源)中添加动态加载这些元素的功能 将标记添加到dom中会起作用,但处理不正确。 HTML是在脚本(来自插入的标记)运行之前处理的,当ng include插入HTML片段时,控制器还没有定义 车身(在硬编码位置
硬编码这个单页应用程序工作得很好
但是我想在这个应用程序(开源)中添加动态加载这些元素的功能
将标记添加到dom中会起作用,但处理不正确。
HTML是在脚本(来自插入的标记)运行之前处理的,当ng include插入HTML片段时,控制器还没有定义
车身(在硬编码位置的延伸部分被注释掉)
日历扩展服务(由控制器使用,在此讨论中缩短)
因此,想要添加扩展名的用户必须创建这些文件,
和编辑主页HTML并插入它们
<div ng-include src="filename.html"></div>
在正确的位置,然后添加
<script src="filename.service" >
及
在正确的位置和顺序,需要在控制器之前完成服务,
当控制器使用服务时
无论如何,添加代码以定位所有扩展并在各自的位置将元素动态插入dom是很容易的。。。但是
在硬编码中,脚本添加在主体中的html之后
因此,我添加了一个新脚本(在加载页面时进行处理),该脚本定位并插入所有元素,以便在正确的位置支持扩展
然后脚本结束了。。。。(硬编码HTML中的最后一个)和HTML指令已被处理,但动态添加的脚本尚未加载或处理,因此找不到控制器
我可以创建一个包含所有这些信息的临时HTML文件并加载它,而不是处理动态加载,但我认为最好解决这个问题
我曾尝试创建自己的angular指令并在中编译,但陷入了循环
<divinc src="filename.service"></divinc>
插入的div是正确的,作为divinc指令的子级
angular.module('SmartMirror')
.directive("divincl", ["$compile" ,function($compile){
return {
priority: 100,
terminal: true,
compile: function(scope, element, attrs) {
var html = "<div ng-include=\"" + element['incl']+ "\" onload='function(){console.log(\'html loaded\')}'></div>"
var templateGoesHere = angular.element(document.getElementById(element['id']));
templateGoesHere.html(html);
//document.body.innerHTML='';
var v= $compile(templateGoesHere);
//scope.$apply();
return function linkFn(scope) {
v(scope) // Link compiled element to scope
}
}
}
}]);
angular.module('SmartMirror'))
.directive(“divincl”、[“$compile”、函数($compile){
返回{
优先:100,
终端:是的,
编译:函数(范围、元素、属性){
var html=“”
var templategoesher=angular.element(document.getElementById(element['id']);
html(html);
//document.body.innerHTML='';
var v=$compile(templategoesere);
//作用域:$apply();
返回函数linkFn(范围){
v(scope)//将编译的元素链接到scope
}
}
}
}]);
关于如何解决这个问题的建议。。感谢为了使angularjs 1.7应用程序动态加载扩展,有两种方法:
- 要么使用“嵌套angularjs应用程序”,这显然是angularjs的高级用法,需要您在两个angularjs应用程序之间进行通信,要么使用$scope.$apply通知其他应用程序进行更新,等等
- 或者,在生成包含应用程序的html页面时,不要在前端动态加载它们,而是在后端动态加载它们。尝试从一开始就列出所有扩展名
ng include
,也不要试图在应用程序的指令中添加
首先,您需要重新理解angularjs应用程序是如何启动的
- 加载主应用程序时,会有一个脚本,其中包含
,angular.module
,angular.directive
,angular.value
,angular.config
。。。有人打电话。这是声明步骤angular.run
- 如果您声明一个模块
,并且在html中有一个带有MyApp
的DOM元素,angularjs将自动在此DOM元素上运行ng app=“MyApp”
,以便启动angular.bootstrap()
。应用程序的执行从这里开始。您不能再在模块MyApp
中声明任何内容MyApp
代码已经被angular清理和删除了。另外,即使您执行了代码,由于声明步骤
已经完成,您不应该创建新的指令或注册新的服务,它也不会工作
一个好方法是,当加载插件时,您:
- 从一开始就加载插件的脚本,它必须声明一个新模块,如
MyPlugin1
- 在包含插件的指令中,输入我发送给您的链接的代码,这样就可以插入子应用程序。最后,在指令的模板中会有一个
- 然后在该节点上调用
,这将使启动子应用程序成为可能angular.bootstrap
MyPlugin1
放入函数中,以创建应用程序工厂。然后使用app.value('param1',parameter1)
初始化应用程序
例如:
function declarePlugin1(myParam1, myParam2) {
var app = angular.module('MyPlugin1', []);
// app.directive();
app.value('myParam1', myParam1);
app.value('myParam2', myParam2);
}
在指令调用中declarePlugin1(“test”,42)
,它将用初始化值声明应用程序MyPlugin1
,然后angular.bootstrap
通知angularjs启动此应用程序
您也可以传递回调,以便在两个应用程序之间进行通信。以便生成angularjs 1.7应用程序加载生成器
<script src="filename.service" >
<script src="filename.controller">
<divinc src="filename.service"></divinc>
angular.module('SmartMirror')
.directive("divincl", ["$compile" ,function($compile){
return {
priority: 100,
terminal: true,
compile: function(scope, element, attrs) {
var html = "<div ng-include=\"" + element['incl']+ "\" onload='function(){console.log(\'html loaded\')}'></div>"
var templateGoesHere = angular.element(document.getElementById(element['id']));
templateGoesHere.html(html);
//document.body.innerHTML='';
var v= $compile(templateGoesHere);
//scope.$apply();
return function linkFn(scope) {
v(scope) // Link compiled element to scope
}
}
}
}]);
function declarePlugin1(myParam1, myParam2) {
var app = angular.module('MyPlugin1', []);
// app.directive();
app.value('myParam1', myParam1);
app.value('myParam2', myParam2);
}