Как мы можем использовать компиляцию $вне директивы в Angularjs
Я хочу использовать $compile
в контроллере внутри функции, а не в директиве. Является ли это возможным? Я пытаюсь использовать код ниже.
$compile('<div ng-attr-tooltip="test">Cancel</div>')(scope)
Но это бросает область видимости undefined. Я попытался передать $scope
внутри функции, но он не работает.
Ответы
Ответ 1
Как Angular знает, что вы изменили DOM? Вам нужно скомпилировать html перед его добавлением (используя службу компиляции $).
Если вам абсолютно необходим доступ за пределами директивы, вы можете создать инжектор.
$(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));
});
});
Ответ 2
Стоит отметить, что инжектор в предыдущем ответе (var $injector = angular.injector(['ng', 'myApp']);
) не добавит компилирующую директиву к вашему текущему запущенному приложению angular, он вместо него создаст новое.
Чтобы динамически добавлять новые директивы в ваше приложение, вы должны использовать уже существовавший инжектор:
$(function() {
angular.element(document).injector().invoke(function($rootScope, $compile) {
$('body').prepend($compile('<div ng-attr-tooltip="test">Cancel</div>')($rootScope));
});
});
Смотрите последний абзац в документации.
Ответ 3
Я пробовал ответить @Vaibhav Jain, без успеха. После небольшого большего копания, это то, что я нашел для работы над Angular 1.3, и jQuery:
$(function() {
angular.element(document).injector().invoke(['$compile', function ($compile) {
// Create a scope.
var $scope = angular.element(document.body).scope();
// Specify what it is we'll be compiling.
var to_compile = '<div ng-attr-tooltip="test">Cancel</div>';
// Compile the tag, retrieving the compiled output.
var $compiled = $compile(to_compile)($scope);
// Ensure the scope and been signalled to digest our data.
$scope.$digest();
// Append the compiled output to the page.
$compiled.appendTo(document.body);
});
});
Ответ 4
Я сделал это
var SCOPE;
app_module.controller('appController', function ($scope, $compile) {
SCOPE = $scope;
$scope.compile = function (elem_from, elem_to) {
var content = $compile(angular.element(elem_from))($scope);
angular.element(elem_to).append(content);
}
});
используйте
SCOPE.compile(elem1.content, elem2);
Ответ 5
Я перекомпилировал свой html следующим образом, когда мне нужно было перекомпилировать мой html, чтобы применить изменения на странице.
Это происходит, когда я пытался перейти на другую ссылку и снова вернуться на страницу, но по какой-то причине код angular не компилировался.
Итак, я исправил это, скомпилировав html-часть страницы снова в событии загрузки.
function OnLoad() {
angular.element("form:first").injector().invoke(['$compile', function ($compile) {
var $scope = angular.element("form:first").scope();
$compile("form:first")($scope);
}]);
}
Ниже приведена декларация приложения.
<form ng-app="formioApp" ng-controller="formioAppCtrl">
и функция OnLoad() назначаются в событии onload на html-элементе на этой странице.