Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how can we use $compile outside a directive in Angularjs

Tags:

I want to use $compile in a controller inside a function and not in a directive. is it possible? I am trying the below code.

$compile('<div ng-attr-tooltip="test">Cancel</div>')(scope) 

But this is throwing scope is undefined error. I tried to pass $scope inside the function but it is not working.

like image 234
user1673394 Avatar asked Mar 13 '14 06:03

user1673394


People also ask

What does $compile do in AngularJS?

Compiles an HTML string or DOM into a template and produces a template function, which can then be used to link scope and the template together.

What is the difference between link and compile in AngularJS?

Link - Programmatically modify resulting DOM element instances, add event listeners, and set up data binding. Compile - Programmatically modify the DOM template for features across copies of a directive, as when used in ng-repeat.

Which directive is used to specify a controller in HTML?

The ng-controller directive adds a controller to your application. In the controller you can write code, and make functions and variables, which will be parts of an object, available inside the current HTML element.


2 Answers

How would Angular know that you changed the DOM? You need to compile your html before appending it (using $compile service).

If you absolutely need access outside of a directive you can create an injector.

$(function() {   // myApp for test directive to work, ng for $compile   var $injector = angular.injector(['ng', 'myApp']);   $injector.invoke(function($rootScope, $compile) {     $('body').prepend($compile('<div ng-attr-tooltip="test">Cancel</div>')($rootScope));   }); }); 
like image 122
Vaibhav Jain Avatar answered Nov 13 '22 13:11

Vaibhav Jain


It's worth to note, the injector in previous answer (var $injector = angular.injector(['ng', 'myApp']);) will not append compiling directive to your currently running angular app, it will create new instead.

To dynamically append new directives to your app, you should use already existed injector:

$(function() {   angular.element(document).injector().invoke(function($rootScope, $compile) {     $('body').prepend($compile('<div ng-attr-tooltip="test">Cancel</div>')($rootScope));   }); }); 

See last paragraph in documentation.

like image 31
idmitme Avatar answered Nov 13 '22 15:11

idmitme