새로운 엘리먼트를 생성하는 방법은 아래 코드와 같다.
function(s, e, a) { var newElement = angular.element(' <div></div> '); e.append(newElement); $compile(newElement)(s); }
여기에 새로 생성되는 엘리먼트에 컨트롤러더 달아주고, ng-click과 같은 기능도 추가해서 만들어 보려고 한다.
일단 html을 아래와 같이 만든다.
<div ng-app="AngApp"> <div ng-controller="MainCtrl"> Hello {{name}}! <my-directive></my-directive> </div> </div>
이제 my-directive 엘리먼트 안에 새로운 엘리먼트를 만들고 함수 호출도 넣어보자.
var app = angular.module('AngApp', []); app.controller('MainCtrl', function($scope) { <!-- 기본 컨트롤러 --> $scope.name = 'World'; }); app.controller('myDirectiveController', function($scope) { $scope.open = function(){ alert('이거 실행되면 안된다. 새로 생성된 dialogCntl의 scope가 실행되야하기 때문이다.'); }; }); app.controller('dialogCntl', function($scope) { $scope.open = function(){ alert('정상적으로 생성 및 생성된 엘리먼트안의 ng-click도 정상 작동'); }; }); app.directive('myDirective', function ($compile) { <!-- 디렉티브 해당 엘리먼트 기능 추가 --> return { restrict : 'E', controller : 'myDirectiveController', link : function(s, e, a) { var newElement = angular.element(' <div ng-controller="dialogCntl">' + '<a ng-click="open()" tabindex="-1" href="#">Result Alert!!</a></div> '); <!-- 엘리먼트를 생성하면서 ng-controller와 ng-click 액션도 함께 담아 생성했다.--> e.append(newElement); $compile(newElement)(s); } } })
제대로 작동하는지 아래 샘플로 확인할 수 있다.
Result 탭을 클릭하여 Result Alert!! 을 눌러 정상적으로 수행되는지 확인해보자.