zoukankan      html  css  js  c++  java
  • Angularjs 动态添加指令并绑定事件

    先说使用场景,动态生成DOM元素并绑定事件,非常常见的一种场景,用jq实现效果:

    http://jsbin.com/gajizuyuju/edit?html,js,output

    var count=0;
    $("#test").on("click",function(event){
      if(event.target.tagName.toLowerCase()=="input") return;
      count++;
      var html="<input type='text' class='newEle' value='"+count+"'/>";
      $(this).html(html);
      $(".newEle").focus();
    });
    $("body").on("blur",".newEle",function(){
      alert($(this).val());
    })

    如果用angularjs应该怎么实现呢?想当然的情况是这样的:

    var myApp = angular.module('myApp', []);
            myApp.controller('MainCtrl', ['$scope','$compile',function($scope) {
                $scope.count = 0;
                $scope.add = function() {
                  if(event.target.tagName.toLowerCase()=="input")return;
                    var target=$(event.target);
                    $scope.count++;
                    target.html("<input value='"+$scope.count+"' ng-blur='showValue()'>" );
                }
                $scope.showValue=function(){
                    alert(event.target.value)
                }
            }])

    理想很丰满,点击test的时候内容确实变成了input,但是input不能绑定任何ng事件。

    稍微修改下:http://jsbin.com/zujalapone/edit?html,js,output

    var myApp = angular.module('myApp', []);
            myApp.controller('MainCtrl', ['$scope','$compile',function($scope, $compile) {
                $scope.count = 0;
                $scope.add = function() {
                  if(event.target.tagName.toLowerCase()=="input")return;
                    var target=$(event.target);
                    $scope.count++;
                    target.html($compile("<input  value='"+$scope.count+"' ng-blur='showValue()'>")($scope));
                }
                $scope.showValue=function(){
                    alert(event.target.value)
                }
            }])

    达到目的~

    这里用到了$compile服务,官方的解释是compile可以将一个HTML字符串或者DOM编译成模板,该模板能够与scope链接起来,也就是说直接插入一段html片段到页面中,虽然能插入进去,但是angular并没有编译,所以任何ng事件指令绑定都是无效的,通过compile能够将html片段先编译后再插入。

  • 相关阅读:
    uva 10099(最大生成树+搜索)
    Codeforces Round #218 (Div. 2) 解题报告
    CodeChef December Challenge 2013 解题报告
    Codeforces Round #217 (Div. 2) 解题报告
    uva 1423 (拓扑排序)
    UESTC 1307 windy数(数位DP)
    Codeforces Round #216 (Div. 2) 解题报告
    Codeforces Round #215 (Div. 2) 解题报告
    uva 10047(BFS)
    uva 10369(最小生成树)
  • 原文地址:https://www.cnblogs.com/hutuzhu/p/6674797.html
Copyright © 2011-2022 走看看