Angular Bootstrap 工具提示动态内容
Angular Bootstrap Tooltip Dynamic Content
我正在 Angular 使用 Angular Bootstrap 创建购物车应用程序。
将鼠标悬停在购物车图标上时,应该会出现一个工具提示。工具提示的内容应根据商品是否已在购物车中而改变。
所以,这里是 html:
<h3><i class="fa fa-shopping-basket" ng-click="add2Cart(item.Name)" tooltip-placement="right" uib-tooltip-html="itemtooltiptext(item.Name)" aria-hidden="true"></i></h3>
基本上,为了检查商品是否已经在购物车中,我希望工具提示文本从函数解析。我从文档中了解到,只要 HTML 受信任,就支持此功能。
它说,
uib-tooltip-html
$ - Takes an expression that evaluates to an HTML string. Note that this HTML is not compiled. If compilation is required, please use the uib-tooltip-template attribute option instead. The user is responsible for ensuring the content is safe to put into the DOM!
所以我的 itemtooltiptext()
函数是...
$scope.itemtooltiptext = function(name) {
if (localStorage.getItem("cart") === null) {
return $sce.trustAsHtml("Add " + name + " to Cart!");
} else {
var cart = JSON.parse(localStorage.getItem("cart"));
for (var i = 0; i < cart.length; i++) {
if (cart[i] == name) {
console.log("already in cart");
return $sce.trustAsHtml(name + "already in Cart!");
}
}
return $sce.trustAsHtml("Add " + name + " to Cart!");
}
}
这导致
Infinite $digest Loop Error
详见此处:
但问题是我需要它来自具有各种条件的函数吗?那么我应该使用模板吗?我不明白这样做会更好,因为我仍然需要从模板提供动态文本...那么解决方案是什么?
谢谢。
这不是你使用 uib-tooltip-html
的方式,显然它会导致无限摘要循环,幸运的是 the demo plunk 告诉你如何去做。
您需要 get/calculate 您的 html,绑定到某个范围变量并将其绑定到 uib-tooltip-html
js
$scope.itemtooltiptext = function() {
$scope.htmlTooltip = $sce.trustAsHtml('I\'ve been made <b>bold</b>!');
};
$scope.itemtooltiptext();
html
<button uib-tooltip-html="htmlTooltip" class="btn btn-default">Tooltip</button>
如果您仍想将一个函数绑定到您的工具提示,您可以这样做
<button uib-tooltip="{{itemtooltiptext()}}" class="btn btn-default">Tooltip</button>
请注意,此方法将在每个摘要周期调用该函数。
我 运行 遇到了这个无限摘要循环问题,我需要一个动态工具提示...它导致 angular 每次都将它重新计算为一个新值(即使它是相同的) .我创建了一个函数来缓存计算值,如下所示:
$ctrl.myObj = {
Title: 'my title',
A: 'first part of dynamic toolip',
B: 'second part of dynamic tooltip',
C: 'some other value',
getTooltip: function () {
// cache the tooltip
var obj = this;
var tooltip = '<strong>A: </strong>' + obj.A + '<br><strong>B: </strong>' + obj.B;
var $tooltip = {
raw: tooltip,
trusted: $sce.trustAsHtml(tooltip)
};
if (!obj.$tooltip) obj.$tooltip = $tooltip;
else if (obj.$tooltip.raw !== tooltip) obj.$tooltip = $tooltip;
return obj.$tooltip;
}
};
然后在html中,我是这样访问的:
<input type="text" ng-model="$ctrl.myObj.C"
uib-tooltip-html="$ctrl.myObj.getTooltip().trusted">
我正在 Angular 使用 Angular Bootstrap 创建购物车应用程序。
将鼠标悬停在购物车图标上时,应该会出现一个工具提示。工具提示的内容应根据商品是否已在购物车中而改变。
所以,这里是 html:
<h3><i class="fa fa-shopping-basket" ng-click="add2Cart(item.Name)" tooltip-placement="right" uib-tooltip-html="itemtooltiptext(item.Name)" aria-hidden="true"></i></h3>
基本上,为了检查商品是否已经在购物车中,我希望工具提示文本从函数解析。我从文档中了解到,只要 HTML 受信任,就支持此功能。
它说,
uib-tooltip-html
$ - Takes an expression that evaluates to an HTML string. Note that this HTML is not compiled. If compilation is required, please use the uib-tooltip-template attribute option instead. The user is responsible for ensuring the content is safe to put into the DOM!
所以我的 itemtooltiptext()
函数是...
$scope.itemtooltiptext = function(name) {
if (localStorage.getItem("cart") === null) {
return $sce.trustAsHtml("Add " + name + " to Cart!");
} else {
var cart = JSON.parse(localStorage.getItem("cart"));
for (var i = 0; i < cart.length; i++) {
if (cart[i] == name) {
console.log("already in cart");
return $sce.trustAsHtml(name + "already in Cart!");
}
}
return $sce.trustAsHtml("Add " + name + " to Cart!");
}
}
这导致
Infinite $digest Loop Error
详见此处:
但问题是我需要它来自具有各种条件的函数吗?那么我应该使用模板吗?我不明白这样做会更好,因为我仍然需要从模板提供动态文本...那么解决方案是什么?
谢谢。
这不是你使用 uib-tooltip-html
的方式,显然它会导致无限摘要循环,幸运的是 the demo plunk 告诉你如何去做。
您需要 get/calculate 您的 html,绑定到某个范围变量并将其绑定到 uib-tooltip-html
js
$scope.itemtooltiptext = function() {
$scope.htmlTooltip = $sce.trustAsHtml('I\'ve been made <b>bold</b>!');
};
$scope.itemtooltiptext();
html
<button uib-tooltip-html="htmlTooltip" class="btn btn-default">Tooltip</button>
如果您仍想将一个函数绑定到您的工具提示,您可以这样做
<button uib-tooltip="{{itemtooltiptext()}}" class="btn btn-default">Tooltip</button>
请注意,此方法将在每个摘要周期调用该函数。
我 运行 遇到了这个无限摘要循环问题,我需要一个动态工具提示...它导致 angular 每次都将它重新计算为一个新值(即使它是相同的) .我创建了一个函数来缓存计算值,如下所示:
$ctrl.myObj = {
Title: 'my title',
A: 'first part of dynamic toolip',
B: 'second part of dynamic tooltip',
C: 'some other value',
getTooltip: function () {
// cache the tooltip
var obj = this;
var tooltip = '<strong>A: </strong>' + obj.A + '<br><strong>B: </strong>' + obj.B;
var $tooltip = {
raw: tooltip,
trusted: $sce.trustAsHtml(tooltip)
};
if (!obj.$tooltip) obj.$tooltip = $tooltip;
else if (obj.$tooltip.raw !== tooltip) obj.$tooltip = $tooltip;
return obj.$tooltip;
}
};
然后在html中,我是这样访问的:
<input type="text" ng-model="$ctrl.myObj.C"
uib-tooltip-html="$ctrl.myObj.getTooltip().trusted">