Ситуация
Вложенный в наш Angular приложение - это директива под названием "Страница", поддерживаемая контроллером, который содержит div с атрибутом ng-bind-html-unsafe. Это присваивается переменной $scope var, называемой "pageContent". Этот var получает динамически генерируемый HTML из базы данных. Когда пользователь переходит на следующую страницу, вызывается вызываемый в БД, а параметр pageContent var устанавливается на этот новый HTML-код, который отображается на экране через ng-bind-html-unsafe. Здесь код:
Директива страницы
angular.module('myApp.directives')
.directive('myPage', function ($compile) {
return {
templateUrl: 'page.html',
restrict: 'E',
compile: function compile(element, attrs, transclude) {
// does nothing currently
return {
pre: function preLink(scope, element, attrs, controller) {
// does nothing currently
},
post: function postLink(scope, element, attrs, controller) {
// does nothing currently
}
}
}
};
});
шаблон шаблона страницы ( "page.html" из свойства templateUrl выше)
<div ng-controller="PageCtrl" >
...
<!-- dynamic page content written into the div below -->
<div ng-bind-html-unsafe="pageContent" >
...
</div>
Контроллер страницы
angular.module('myApp')
.controller('PageCtrl', function ($scope) {
$scope.pageContent = '';
$scope.$on( "receivedPageContent", function(event, args) {
console.log( 'new page content received after DB call' );
$scope.pageContent = args.htmlStrFromDB;
});
});
Это работает. Мы видим, что HTML-страница из БД, сделанная красиво в браузере. Когда пользователь перевернется на следующую страницу, мы увидим содержимое следующей страницы и т.д. Пока все хорошо.
Проблема
Проблема заключается в том, что мы хотим иметь интерактивный контент внутри содержимого страницы. Например, HTML может содержать уменьшенное изображение, где, когда пользователь нажимает на него, Angular должен делать что-то потрясающее, например, отображать всплывающее модальное окно. Я поместил вызовы методов Angular (ng-click) в строки HTML в нашей базе данных, но, конечно, Angular не будет распознавать вызовы или директивы метода, если он каким-то образом не анализирует строку HTML, не распознает их и компилирует их.
В нашей DB
Содержание для страницы 1:
<p>Here a cool pic of a lion. <img src="lion.png" ng-click="doSomethingAwesone('lion', 'showImage')" > Click on him to see a large image.</p>
Содержание для страницы 2:
<p>Here a snake. <img src="snake.png" ng-click="doSomethingAwesone('snake', 'playSound')" >Click to make him hiss.</p>
Вернемся в контроллер страницы, затем добавим соответствующую функцию $scope:
Контроллер страницы
$scope.doSomethingAwesome = function( id, action ) {
console.log( "Going to do " + action + " with "+ id );
}
Я не могу понять, как вызвать этот метод doSomethingAwesome из строки HTML из БД. Я понимаю, что Angular должен каким-то образом анализировать HTML-строку, но как? Я читал смутные расплывчатые сообщения об услуге компиляции $, копировал и вставлял несколько примеров, но ничего не работает. Кроме того, большинство примеров показывают, что динамический контент устанавливается только во время фазы связывания директивы. Мы хотели бы, чтобы Страница оставалась в живых на протяжении всей жизни приложения. Он постоянно получает, компилирует и отображает новый контент, когда пользователь просматривает страницы.
В абстрактном смысле, я думаю, вы могли бы сказать, что мы пытаемся динамически вставлять фрагменты Angular в приложение Angular и должны иметь возможность их вносить и удалять.
Я несколько раз читал различные фрагменты документации Angular, а также всевозможные сообщения в блогах и JS Fiddled with people code. Я не знаю, полностью ли я недопонимаю Angular, или просто отсутствует что-то простое, или, может быть, я медленный. В любом случае, я мог бы использовать некоторые советы.