我在互联网上搜索的时间很长,很难找到答案。我的问题很简单,我希望在我的标记中有这样的东西:
<div my-tooltip-template="'mytt.tpl.html'" my-tooltip-scope="myDataItem">Some text...</div>
编辑:其中myDataItem
是一个范围变量,其中包含我的数据对象,并且模板可能如下所示:
<h1>{{dataItem.title}}</h1>
<span>{{dataItem.description}}</span>
我希望将该模板与包含myDataItem
作为dataItem
的范围一起编译并显示为工具提示。通过试验ui-bootstrap
tooltip
模块我可以看出,将html注入工具提示的方法是使用指令tooltip-html-unsafe
,但注入的html不会被编译,即,不评估角度表达式,不扩展指令等。
如何为此创建指令?我想要一个精益求精的结果,我不想包含jQuery或任何其他库,只需要AngularJS和ui-bootstrap。
非常感谢!
答案 0 :(得分:7)
我能够复制并覆盖tooltip-html-unsafe
的指令angular.module( 'ui.bootstrap.tooltip')
.directive( 'tooltipSpecialPopup', function () {
return {
restrict: 'EA',
replace: true,
scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },
templateUrl: 'tooltip.tpl.html'
};
})
.directive( 'tooltipSpecial', [ '$tooltip', function ( $tooltip ) {
return $tooltip( 'tooltipSpecial', 'tooltip', 'mouseenter' );
}]);
我刚刚在指令名称中将unsafe位更改为special并更改了模板。
这里是Plunker
答案 1 :(得分:6)
以下是如何根据您的要求创建工具提示的蓝图(或使用ui-bootstrap的工具提示修改/包含此工具提示)。
app.directive("myTooltipTemplate", function($compile){
var contentContainer;
return {
restrict: "A",
scope: {
myTooltipScope: "="
},
link: function(scope, element, attrs, ctrl, linker){
var templateUrl = attrs.myTooltipTemplate;
element.append("<div ng-include='\"" + templateUrl + "\"'></div>");
var toolTipScope = scope.$new(true);
angular.extend(toolTipScope, scope.myTooltipScope);
$compile(element.contents())(toolTipScope);
}
};
});
当然,这没有任何实际的工具提示功能,如弹出窗口,放置等... - 它只是将编译的模板附加到该指令适用的任何元素。
使用更接近工具提示的行为更改了plunker;
答案 2 :(得分:2)
我发现这个问题在AngularJS,jQuery(和其他库)中免费搜索经典的工具提示实现。
如果有人正在搜索一个指令,我已经构建了以下指令:
app.directive('tooltip', function($sce, $compile) {
return {
restrict: 'A',
scope: {
content: '=tooltipContent'
},
link: function(scope, element, attributes) {
/* Attributes */
scope.displayTooltip = false;
/* Methods */
scope.updateTooltipPosition = function(top, left) {
tooltip.css({
top: top + 'px',
left: left + 'px',
});
};
scope.getSafeContent = function(content) {
return $sce.trustAsHtml(content);
};
/* Bootstrap */
var tooltip = angular.element(
'<div ng-show="displayTooltip" class="tooltip">\
<span ng-bind-html="getSafeContent(content)"></span>\
</div>'
);
angular.element(document.querySelector('body')).append(tooltip);
/* Bindings */
element.on('mouseenter', function(event) {
scope.displayTooltip = true;
scope.$digest();
});
element.on('mousemove', function(event) {
scope.updateTooltipPosition(event.clientY + 15, event.clientX + 15);
});
element.on('mouseleave', function() {
scope.displayTooltip = false;
scope.$digest();
});
/* Compile */
$compile(tooltip)(scope);
}
};
});
您可以在此处进行测试:http://jsfiddle.net/m4sr9jmn/2/
希望它会有所帮助!