Может быть, это может помочь вам.
Я пытался реализовать решение @S.Klechkovski здесь, но мне это не удалось. Но пусть кто-нибудь поэкспериментирует с этим.
Но на самом деле я сделал то, что вам нужно здесь:
function appCtrl($scope, $compile) {
function onIntroAfterChange(targetElement, scope) {
angular.element(document.querySelector(".introjs-tooltiptext"))
.append($compile(
angular.element(
"<button my-directive>Test Directive</button>"))
(scope)).html()
}
$scope.onIntroAfterChange = onIntroAfterChange;
$scope.IntroOptions = {
steps: [{
element: "#step1",
intro: "Click the button:",
position: 'bottom'
}]
};
}
(подсказка состоит в том, чтобы использовать ng-intro-onAfterChange
для компиляции с использованием надлежащей области видимости) Плохая часть заключается в том, что я жестко запрограммировал шаблон там.
Но вы можете пойти дальше и установить шаблон как атрибут элемента, для которого вы хотите показывать всплывающую подсказку. Не имел возможности получить доступ к intro
полю шага. Итак... Извините за этот крайний уровень кодирования порнографии здесь (кажется, работает):
Полный JS:
angular.module("app", ["angular-intro"])
.directive("myDirective", myDirective)
.controller("appController", appCtrl);
function myDirective() {
return {
restrict: 'A',
link: function(scope, element, attrs) {
element.bind('click', function() {
console.log('you clicked the directive');
});
}
};
};
function appCtrl($scope, $compile) {
function onIntroAfterChange(targetElement, scope) {
angular.element(document.querySelector(".introjs-tooltiptext"))
.append($compile(
angular.element(targetElement).attr("data-template"))
(scope)).html()
}
$scope.onIntroAfterChange = onIntroAfterChange;
$scope.IntroOptions = {
steps: [{
element: "#step1",
intro: "Click the button:",
position: 'bottom'
}]
};
}
Полный HTML
<body ng-app="app" ng-controller="appController">
<div ng-intro-options="IntroOptions" ng-intro-autostart="true" ng-intro-onafterchange="onIntroAfterChange">
<p id="step1" data-template="<button my-directive>Test Directive</button>">
Text
</p>
<button my-directive>Test Directive</button>
Примечание: здесь страшный совет, который вам может понадобиться для переноса кода внутри onIntroAfterChange
с $timeout
. Надеюсь, вам это не понадобится
PS: На самом деле проблема в том, что мы используем IntroJS из AngularJS. Либы имеют совершенно разные подходы, поэтому их смешивание — это боль.
PPS: Надеюсь, кто-то сможет предложить лучшее решение, чем я.
PPS: Лучшее решение — переписать introJS с использованием директив Angular.
person
Igor Tsvetkoff
schedule
16.05.2016