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>
View Code

點擊修改資料按鈕,新插入的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>
View Code

問題解決了。此時動態插入的元素就可以執行angular指令了,客官可以打開控制台操作以上實例查看結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM