AngularJS初始化静态模板

AngularJS可以通过ng-app来自动初始化模块,也可以通过angular.bootstrap(document, [module])手动启动应用,不管用哪种方法,应用启动后,动态往dom树里面添加的dom元素,无法执行angular指令,即无法通过ng-model、ng-click给动态添加的dom元素绑定数据和事件,怎么办?

动态添加dom元素的场景非常常见,如点击某页面上修改用户资料的按钮,发送ajax请求去查询用户资料,然后通过模板引擎将事先写在页面里的静态模板编译成HTML字符串,最后将HTML字符串append到页面显示出来,一般情况下我们会这样做:

<!DOCTYPE html>
<html ng-app="app">
<head>
    <title>demo</title>
    <meta charset="utf-8"/>
    <script src="http://cdn.bootcss.com/jquery/3.0.0-alpha1/jquery.min.js"></script>
    <script id="others_angular_103" type="text/javascript" class="library" src="http://sandbox.runjs.cn/js/sandbox/other/angular.min.js"></script>
    <style>
        .contani{
            width: 100%;
            height: 300px;
            border: 1px solid red;
        }
    </style>
</head>
<body ng-controller="myCtrl">
<script>
    var app = angular.module(‘app‘,[]);
    app.controller(‘myCtrl‘, [‘$scope‘,‘$compile‘,function(scope,$compile){
        scope.valchange = function(){
            console.log(‘value change‘)
        }
        scope.edit = function(){
            //假设这是ajax返回的数据
            scope.username = ‘wangmeijian‘;
            scope.password = ‘000000‘;
            $(".contani").html(myTmpl.innerHTML);
        }
    }])
</script>
<button ng-click="edit()">修改资料</button>
<div class="contani"></div>
<script type="text/html" id="myTmpl">
    <form>
        用户名:<input type="text" ng-model="username" />
        密码:<input type="text" ng-model="password"  />
    </form>
</script>
</body>
</html>

点击修改资料按钮,新插入的dom元素并没有绑定ajax返回的数据,这是因为点击按钮前angular已经初始化完毕了,解决办法当然不是再初始化一次,而是单独使用$compile编译静态模板的HTML,然后再插入dom树中

<!DOCTYPE html>
<html ng-app="app">
<head>
    <title>demo</title>
    <meta charset="utf-8"/>
    <script src="http://cdn.bootcss.com/jquery/3.0.0-alpha1/jquery.min.js"></script>
    <script id="others_angular_103" type="text/javascript" class="library" src="http://sandbox.runjs.cn/js/sandbox/other/angular.min.js"></script>
    <style>
        .contani{
            width: 100%;
            height: 300px;
            border: 1px solid red;
        }
    </style>
</head>
<body ng-controller="myCtrl">
<script>
    var app = angular.module(‘app‘,[]);
    app.controller(‘myCtrl‘, [‘$scope‘,‘$compile‘,function(scope,$compile){
        scope.valchange = function(){
            console.log(‘value change‘)
        }
        scope.edit = function(){
            //假设这是ajax返回的数据
            scope.username = ‘wangmeijian‘;
            scope.password = ‘000000‘;
            //$(".contani").html(myTmpl.innerHTML);
            $(".contani").append( $compile(myTmpl.innerHTML)(scope) )
        }
    }])
</script>
<button ng-click="edit()">修改资料</button>
<div class="contani"></div>
<script type="text/html" id="myTmpl">
    <form>
        用户名:<input type="text" ng-model="username" ng-change="valchange()" />
        密码:<input type="text" ng-model="password"  ng-change="valchange()" />
    </form>
</script>
</body>
</html>

问题解决了。此时动态插入的元素就可以执行angular指令了,客官可以打开控制台操作以上实例查看结果

时间: 2024-08-11 05:43:35

AngularJS初始化静态模板的相关文章

Angular系列----AngularJS入门教程02:静态模板(转载)

为了说明angularJS如何增强了标准HTML,我们先将创建一个静态HTML页面模板,然后把这个静态HTML页面模板转换成能动态显示的AngularJS模板. 在本步骤中,我们往HTML页面中添加两个手机的基本信息,用以下命令将工作目录重置到步骤1. git checkout -f step-1 请编辑app/index.html文件,将下面的代码添加到index.html文件中,然后运行该应用查看效果. app/index.html <ul> <li> <span>

[转载]AngularJS入门教程01:静态模板

为了说明angularJS如何增强了标准HTML,我们先将创建一个静态HTML页面模板,然后把这个静态HTML页面模板转换成能动态显示的AngularJS模板. 在本步骤中,我们往HTML页面中添加两个手机的基本信息,用以下命令将工作目录重置到步骤1. git checkout -f step-1 请编辑app/index.html文件,将下面的代码添加到index.html文件中,然后运行该应用查看效果. app/index.html <ul> <li> <span>

2016最新京东商城首页静态模板下载

2016最新京东商城首页静态模板下载 预览 百度云盘下载

AngularJS学习---更多模板(More Templating) step 8

1.切换分支 [email protected]:~/develop/angular-phonecat$ git checkout step-8 #切换分支 [email protected]-pc:~/develop/angular-phonecat$ npm start #启动项目 2.需求: 将step 7 中的手机详细信息展示出来,加上各种参数配置,图片展示等等. 3.效果: 这里很明显要比step 7中的信息详细的多,而且效果要好很多.究竟是怎么实现的呢? 3.实现代码: 首先,所有需

JFinal集成Beetl静态模板

话说Beetl模板框架比Freemarker模板还要快,至于到底怎么样,目前还没有感觉到,不管那么多了,上手再说. 首先需要下载beetl包:Beetl模板路径 Beetl提供JFinal框架的集成,使用BeetRenderFactory类,通过如下代码注册即可完成集成: @Override public void configConstant(Constants me) { loadPropertyFile("jdbc.properties"); //配置模板 me.setMainR

解决vue-cli不能初始化webpack模板的问题(vue init卡住了,解决办法)

报这个错误 有人说是代理问题.我也不懂,但这个方法有用 1.去github上下载要初始化的模板 https://github.com/vuejs-templates/webpack 或者直接用git去clone你要的模板. 2.将下载好的模板解压.git clone的不用解压. 3.将文件夹放到c:/administrator/.vue-templates/文件夹下面 准备工作就做完了 4.然后该干啥干啥.在你的项目文件下执行vue init <你刚才下载的模板,如:webpack,或者webp

springboot项目实现excel静态模板下载

excel静态模板下载,有两种方式:第一种,在http头中指定输出文件流的类型为"application/vnd.ms-excel"类型时,输出流时就不需要添加输出文件的后缀名:第二种,指定文件流的类型为"multipart/form-data"时,输出流时需要判断文件是.xls/.xlsx,并且加上后缀名. 1.方式一: controller层代码: @GetMapping("/download") public Result<Strin

cumulocityiot mqtt静态模板

MQTT静态模板 总览 为了简化设备集成,Cumulocity IoT已经支持许多静态模板,任何客户端都可以使用它们,而无需创建自己的模板.这些模板专注于用于设备管理目的的最常用消息. 要使用下面列出的模板,您需要将消息发布到主题s/us(t/us用于临时处理已发布内容,q/us用于静态处理已发布内容或c/us用于CEP处理已发布内容.有关更多信息,请参阅参考指南中的SmartREST>处理模式.信息. 您需要预订主题s/ds才能接收使用静态模板的操作. 自动创建设备 静态模板主题支持自动创建设

走进AngularJs(二) ng模板中常用指令的使用方式

通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板开始入手是个不错方式,因为这部分内容相对简单好理解,而且是视图层的东西,大家都喜欢可以立马看得见的东西嘛.本篇我将搜罗模板中的常用指令一一测试,了解其使用方法,有点像背单词的感觉,会比较枯燥.不过对于初学,这样的枯燥是必须要经历的,开始~ 一.模板中可使用的东西及表达式 模板中可以使用的东西包括以下