Sử dụng Bootstrap Tooltip với AngularJS


90

Tôi đang cố gắng sử dụng chú giải công cụ Bootstrap trong một ứng dụng của tôi. Ứng dụng của tôi đang sử dụng AngularJS Hiện tại, tôi có những thứ sau:

<button type="button" class="btn btn-default" 
        data-toggle="tooltip" data-placement="left"
        title="Tooltip on left">
            Tooltip on left
</button>

Tôi nghĩ tôi cần sử dụng

$("[data-toggle=tooltip]").tooltip();

Tuy nhiên, tôi không chắc lắm. Ngay cả khi tôi thêm dòng ở trên, mã của tôi không hoạt động. Tôi đang cố gắng tránh sử dụng UI bootstrap vì nó có nhiều thứ hơn tôi cần. Tuy nhiên, nếu tôi chỉ bao gồm phần chú giải công cụ, tôi sẽ sẵn sàng cho điều đó. Tuy nhiên, tôi không thể tìm ra cách để làm điều đó.

Ai đó có thể chỉ cho tôi cách làm cho Bootstrap Tooltip hoạt động với AngularJS không?


4
Nếu không sử dụng Angular-UI Bootstrap, bạn sẽ cần thực hiện tất cả các ràng buộc cho các sự kiện của mình. Nếu bạn không muốn sử dụng UI Bootstrap vì nó có nhiều thứ hơn bạn cần, hãy cân nhắc chỉ tải những phần bạn cần: github.com/angular-ui/bootstrap/tree/master/src/popover
TheSharpieOne

Câu trả lời:


151

Để các chú giải công cụ hoạt động ngay từ đầu, bạn phải khởi tạo chúng trong mã của mình. Bỏ qua AngularJS trong một giây, đây là cách bạn có được các chú giải công cụ để hoạt động trong jQuery:

$(document).ready(function(){
    $('[data-toggle=tooltip]').hover(function(){
        // on mouseenter
        $(this).tooltip('show');
    }, function(){
        // on mouseleave
        $(this).tooltip('hide');
    });
});

Điều này cũng sẽ hoạt động trong ứng dụng AngularJS miễn là nó không được hiển thị nội dung bởi Angular (ví dụ: ng-repeat). Trong trường hợp đó, bạn cần viết một chỉ thị để xử lý việc này. Đây là một chỉ thị đơn giản phù hợp với tôi:

app.directive('tooltip', function(){
    return {
        restrict: 'A',
        link: function(scope, element, attrs){
            element.hover(function(){
                // on mouseenter
                element.tooltip('show');
            }, function(){
                // on mouseleave
                element.tooltip('hide');
            });
        }
    };
});

Sau đó, tất cả những gì bạn phải làm là bao gồm thuộc tính "chú giải công cụ" trên phần tử bạn muốn chú giải công cụ xuất hiện:

<a href="#0" title="My Tooltip!" data-toggle="tooltip" data-placement="top" tooltip>My Tooltip Link</a>

Hy vọng rằng sẽ giúp!


Giải pháp tốt! Tôi đã thay thế app.directive bằng angle.module ('tooltip', []). Chỉ thị để làm cho nó hoạt động trong ứng dụng của tôi.
Beanwah

Giải pháp tốt. Chúng ta có thể thêm một số css vào nó để thay đổi chú giải công cụ không?

1
Có thể thêm vào $(element).tooltip({html: 'true', container: 'body'})trước khi gọi hiển thị chú giải công cụ làm ví dụ về việc cung cấp các tùy chọn tùy chỉnh.
Vajk Hermecz

1
element.tooltip()có thể được sử dụng thay vì jQuery.
Brian

1
Thật là một câu trả lời hay
Gimmly

58

Giải pháp tốt nhất mà tôi có thể đưa ra là đưa thuộc tính "onmouseenter" vào phần tử của bạn như sau:

<button type="button" class="btn btn-default" 
    data-placement="left"
    title="Tooltip on left"
    onmouseenter="$(this).tooltip('show')">
</button>

1
Boostrap JS là một thư viện jQuery. Ít nhất đó là trong Bootstrap 3.
gabeodess

1
Hoạt động với Angular 2+. Cảm ơn!
Songtham T.

32

Câu trả lời đơn giản - sử dụng UI Bootstrap ( ui.bootstrap.tooltip )

Có vẻ như có một loạt các câu trả lời rất phức tạp cho câu hỏi này. Đây là những gì đã làm việc cho tôi.

  1. Cài đặt UI Bootstrap -$ bower install angular-bootstrap

  2. Chèn UI Bootstrap làm phụ thuộc - angular.module('myModule', ['ui.bootstrap']);

  3. Sử dụng chỉ thị uib-tooltip trong html của bạn.


<button class="btn btn-default"
        type="button"
        uib-tooltip="I'm a tooltip!">
     I'm a button!
</button>

2
Không có jQuery, sử dụng Angular thuần túy và ui-bootstrap; Đây là những gì tôi đang tìm kiếm, nhờ
Rsh

Giải pháp duy nhất làm việc cho tôi. Cảm ơn bạn! (@Kondal - vâng, nó hoạt động mà không cần jQuery).
Nick Grealy

28

Nếu bạn đang xây dựng một ứng dụng Angular, bạn có thể sử dụng jQuery, nhưng có rất nhiều lý do chính đáng để cố gắng tránh nó để ủng hộ các mô hình hướng góc cạnh hơn. Bạn có thể tiếp tục sử dụng các kiểu được cung cấp bởi bootstrap, nhưng thay thế các plugin jQuery bằng góc gốc bằng cách sử dụng UI Bootstrap

Bao gồm các tệp CSS Boostrap, Angular.js và ui.Bootstrap.js:

<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://code.angularjs.org/1.2.20/angular.js"></script>
<script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.11.0.js"></script>

Đảm bảo rằng bạn đã tiêm ui.bootstrapkhi tạo mô-đun của mình như sau:

var app = angular.module('plunker', ['ui.bootstrap']);

Sau đó, bạn có thể sử dụng các chỉ thị góc thay vì các thuộc tính dữ liệu được jQuery chọn:

<button type="button" class="btn btn-default" 
        title="Tooltip on left" data-toggle="tooltip" data-placement="left"
        tooltip="Tooltip on left" tooltip-placement="left" >
  Tooltip on left
</button>

Demo trong Plunker


Tránh khởi động giao diện người dùng

jQuery.min.js (94kb) + Bootstrap.min.js (32kb) cũng cung cấp cho bạn nhiều hơn những gì bạn cần và nhiều hơn ui-bootstrap.min.js (41kb) .

Và thời gian tải xuống các mô-đun chỉ là một khía cạnh của hiệu suất.

Nếu bạn thực sự muốn chỉ tải các mô-đun bạn cần, bạn có thể "Tạo bản dựng" và chọn chú giải công cụ từ trang web Bootstrap-UI . Hoặc bạn có thể khám phá mã nguồn cho các chú giải công cụ và chọn những gì bạn cần.

Đây là một bản dựng tùy chỉnh được thu nhỏ chỉ với chú giải công cụ và mẫu (6kb)


Cần lưu ý rằng, như khi viết, v 0.12.1 dành cho v1.2 của Angular. nhánh 0.13 sẽ dành cho Angular 1.3+ nhưng người bảo trì mới vẫn đang làm việc này (và làm rất tốt!)
Nick

11

Bạn đã bao gồm Bootstrap JS và jQuery chưa?

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min.js"></script>

Nếu bạn chưa tải những thứ đó, thì Angular UI ( http://angular-ui.github.io/bootstrap/ ) có thể không tốn nhiều chi phí. Tôi sử dụng nó với ứng dụng Angular của mình và nó có chỉ thị Tooltip. Hãy thử sử dụngtooltip="tiptext"

<button type="button" class="btn btn-default" 
        data-toggle="tooltip" data-placement="left"
        title="Tooltip on left"
        tooltip="This is a Bootstrap tooltip"
        tooltip-placement="left" >
            Tooltip on left
</button>

Cảm ơn @prototype! Tôi đã định tìm câu trả lời @gabeodess, nhưng thích giải pháp này hơn vì nó không nói rõ rằng nó cần jQuery, điều này làm cho điều này ít kết hợp hơn một chút và dễ dàng thay đổi hơn một chút cho một giải pháp hoàn chỉnh trong tương lai.
hatrumandcode

8

Tôi đã viết một Chỉ thị Angular đơn giản đang hoạt động tốt cho chúng tôi.

Đây là bản demo: http://jsbin.com/tesido/edit?html,js,output

Chỉ thị (cho Bootstrap 3) :

// registers native Twitter Bootstrap 3 tooltips
app.directive('bootstrapTooltip', function() {
  return function(scope, element, attrs) {
    attrs.$observe('title',function(title){
      // Destroy any existing tooltips (otherwise new ones won't get initialized)
      element.tooltip('destroy');
      // Only initialize the tooltip if there's text (prevents empty tooltips)
      if (jQuery.trim(title)) element.tooltip();
    })
    element.on('$destroy', function() {
      element.tooltip('destroy');
      delete attrs.$$observers['title'];
    });
  }
});

Lưu ý: Nếu bạn đang sử dụng Bootstrap 4, trên dòng 6 & 11 ở trên, bạn sẽ cần thay thế tooltip('destroy')bằng tooltip('dispose')(Cảm ơn người dùng1191559 cho bản cập nhật này )

Chỉ cần thêm bootstrap-tooltiplàm thuộc tính cho bất kỳ phần tử nào có title. Angular sẽ theo dõi các thay đổi đối với titlenhưng nếu không thì chuyển việc xử lý chú giải công cụ sang Bootstrap.

Điều này cũng cho phép bạn sử dụng bất kỳ Tùy chọn chú giải công cụ Bootstrap gốc nào làm data-thuộc tính theo cách Bootstrap thông thường.

Đánh dấu :

<div bootstrap-tooltip data-placement="left" title="Tooltip on left">
        Tooltip on left
</div>

Rõ ràng điều này không có tất cả các ràng buộc phức tạp và tích hợp nâng cao mà AngularStrap và UI Bootstrap cung cấp, nhưng đó là một giải pháp tốt nếu bạn đã sử dụng Bootstrap's JS trong ứng dụng Angular của mình và bạn chỉ cần một cầu chú giải công cụ cơ bản trên toàn bộ ứng dụng của mình mà không cần sửa đổi bộ điều khiển hoặc quản lý các sự kiện chuột.


1
Đã cố gắng sử dụng cái này và tôi gặp Error: cannot call methods on tooltip prior to initialization; attempted to call method 'destroy'lỗi.
Chris

@CD Hmm ... Tôi chưa thể tạo lại lỗi đó. Tôi đã thêm url demo này vào câu trả lời: jsbin.com/tesido/edit?html,js,output Nếu bạn biết mã của mình khác biệt như thế nào, hãy cho tôi biết và tôi sẽ xem nếu tôi có thể giúp. Bằng cách này, bản demo đang sử dụng v1.2 kiễu góc, Bootstrap v3.3, jQuery v2.1
brandonjp

1
Cảm ơn bạn, đây là mẫu duy nhất trong các mẫu này cập nhật động chú giải công cụ nếu tiêu đề thay đổi thông qua liên kết.
dalcam

1
BTW cho BS4, bạn phải hoán đổi dòng: element.tooltip('destroy'); với element.tooltip('dispose');ở cả hai nơi.
dalcam

4

Bạn có thể sử dụng selector tùy chọn cho các ứng dụng trang đơn động:

jQuery(function($) {
    $(document).tooltip({
        selector: '[data-toggle="tooltip"]'
    });
});

nếu bộ chọn được cung cấp, các đối tượng chú giải công cụ sẽ được ủy quyền cho các mục tiêu được chỉ định. Trên thực tế, điều này được sử dụng để cho phép nội dung HTML động có thêm chú giải công cụ.


4

Bạn có thể tạo một chỉ thị đơn giản như sau:

angular.module('myApp',[])
    .directive('myTooltip', function(){
        return {
            restrict: 'A',
            link: function(scope, element){
                element.tooltip();
            }
        }
    });

Sau đó, thêm chỉ thị tùy chỉnh của bạn khi cần thiết:

<button my-tooltip></button>

3

Bạn có thể làm điều này với AngularStrap

là một tập hợp các lệnh gốc cho phép tích hợp liền mạch Bootstrap 3.0+ vào ứng dụng AngularJS 1.2+ của bạn. "

Bạn có thể chèn toàn bộ thư viện như thế này:

var app = angular.module('MyApp', ['mgcrea.ngStrap']); 

Hoặc chỉ kéo tính năng chú giải công cụ như thế này:

var app = angular.module('MyApp', ['mgcrea.ngStrap.tooltip']); 

Demo trong Stack Snippets

var app = angular.module('MyApp', ['mgcrea.ngStrap']);  
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.1.2/angular-strap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.1.2/angular-strap.tpl.min.js"></script>

<div ng-app="MyApp" class="container" >

  <button type="button" 
          class="btn btn-default" 
          data-trigger="hover" 
          data-placement="right"
          data-title="Tooltip on right"
          bs-tooltip>
    MyButton
  </button>

</div>


2

cách dễ nhất, thêm $("[data-toggle=tooltip]").tooltip();vào bộ điều khiển liên quan.


1

var app = angular.module('MyApp', ['mgcrea.ngStrap']);  
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.1.2/angular-strap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/2.1.2/angular-strap.tpl.min.js"></script>

<div ng-app="MyApp" class="container" >

  <button type="button" 
          class="btn btn-default" 
          data-trigger="hover" 
          data-placement="right"
          data-title="Tooltip on right"
          bs-tooltip>
    MyButton
  </button>

</div>


3
Vui lòng thêm một số giải thích cho câu trả lời của bạn.
André Kool

1

Hãy nhớ một điều nếu bạn muốn sử dụng chú giải công cụ bootstrap trong anglejs là thứ tự các tập lệnh của bạn nếu bạn cũng đang sử dụng jquery-ui, nó phải là:

  • jQuery
  • giao diện người dùng jQuery
  • Bootstap

Nó được thử và kiểm tra


1

Chỉ đọc phần này nếu bạn đang chỉ định động các chú giải công cụ

I E <div tooltip={{ obj.somePropertyThatMayChange }} ...></div>

Tôi gặp sự cố với chú giải công cụ động không phải lúc nào cũng cập nhật với chế độ xem. Ví dụ, tôi đang làm một cái gì đó như thế này:

Điều này không hoạt động nhất quán

<div ng-repeat="person in people">
    <span data-toggle="tooltip" data-placement="top" title="{{ person.tooltip }}">
      {{ person.name }}
    </span> 
</div> 

Và kích hoạt nó như vậy:

$timeout(function() {
  $(document).tooltip({ selector: '[data-toggle="tooltip"]'});
}, 1500)

Tuy nhiên, vì mảng người của tôi sẽ thay đổi các chú giải công cụ của tôi sẽ không luôn cập nhật. Tôi đã thử mọi cách sửa chữa trong chủ đề này và những người khác không gặp may. Sự cố dường như chỉ xảy ra khoảng 5% thời gian và gần như không thể lặp lại.

Thật không may, những chú giải công cụ này là nhiệm vụ quan trọng đối với dự án của tôi và việc hiển thị chú giải công cụ không chính xác có thể rất tệ.

Điều gì dường như là vấn đề

Bootstrap đang sao chép giá trị của thuộc titletính sang một thuộc tính mới data-original-titlevà xóa thuộc titletính (đôi khi) khi tôi kích hoạt các toooltips. Tuy nhiên, khi tôi title={{ person.tooltip }}thay đổi giá trị mới sẽ không phải lúc nào cũng được cập nhật vào thuộc tính data-original-title. Tôi đã thử hủy kích hoạt chú giải công cụ và kích hoạt lại chúng, phá hủy chúng, liên kết trực tiếp với thuộc tính này ... mọi thứ. Tuy nhiên, mỗi thứ đều không hoạt động hoặc tạo ra các vấn đề mới; chẳng hạn như các thuộc tính titledata-original-titleđều bị xóa và không bị ràng buộc khỏi đối tượng của tôi.

Những gì đã làm việc

Có lẽ là đoạn mã xấu xí nhất mà tôi từng đẩy, nhưng nó đã giải quyết được vấn đề nhỏ nhưng quan trọng này đối với tôi. Tôi chạy mã này mỗi khi chú giải công cụ được cập nhật với dữ liệu mới:

$timeout(function() {
    $('[data-toggle="tooltip"]').each(function(index) {
      // sometimes the title is blank for no apparent reason. don't override in these cases.
      if ($(this).attr("title").length > 0) {
        $( this ).attr("data-original-title", $(this).attr("title"));
      }
    });
    $timeout(function() {
      // finally, activate the tooltips
      $(document).tooltip({ selector: '[data-toggle="tooltip"]'});
    }, 500);
}, 1500);

Những gì đang xảy ra ở đây về bản chất là:

  • Chờ một khoảng thời gian (1500 mili giây) để chu kỳ thông báo hoàn tất và các thông titlebáo sẽ được cập nhật.
  • Nếu có một thuộc titletính không trống (tức là nó đã thay đổi), hãy sao chép nó vào thuộc data-original-titletính đó để nó được lấy bằng các công cụ của Bootstrap.
  • Kích hoạt lại chú giải công cụ

Hy vọng câu trả lời dài này sẽ giúp những người có thể đang gặp khó khăn như tôi.


1

Thử Tooltip (ui.bootstrap.tooltip). Xem chỉ thị Angular cho Bootstrap

<button type="button" class="btn btn-default" tooltip-placement="bottom" uib-tooltip="tooltip message">Test</button>

Bạn nên tránh mã JavaScript trên đầu AngularJS


1

để nhận các chú giải công cụ để làm mới khi mô hình thay đổi , tôi chỉ cần sử dụng data-original-titlethay vì title.

ví dụ

<i class="fa fa-gift" data-toggle="tooltip" data-html="true" data-original-title={{getGiftMessage(gift)}} ></i>

lưu ý rằng tôi đang khởi tạo việc sử dụng các chú giải công cụ như sau:

<script type="text/javascript">
    $(function () {
        $("body").tooltip({ selector: '[data-toggle=tooltip]' });
    })
</script>

phiên bản:

  • AngularJS 1.4.10
  • bootstrap 3.1.1
  • jquery: 1.11.0

0

AngularStrap không hoạt động trong IE8 với phiên bản anglejs 1.2.9 vì vậy không sử dụng tính năng này nếu ứng dụng của bạn cần hỗ trợ IE8


0

impproving @aStewartDesign câu trả lời:

.directive('tooltip', function(){
  return {
    restrict: 'A',
    link: function(scope, element, attrs){
      element.hover(function(){
        element.tooltip('show');
      }, function(){
        element.tooltip('hide');
      });
    }
  };
});

Không cần phải jquery, nó là một nhà khảo sát muộn nhưng tôi nhận ra rằng đây là người được bình chọn nhiều nhất, tôi nên chỉ ra điều này.


0

cài đặt các phụ thuộc:

npm install jquery --save
npm install tether --save
npm install bootstrap@version --save;

tiếp theo, thêm các tập lệnh vào angle-cli.json của bạn

"scripts": [
        "../node_modules/jquery/dist/jquery.min.js",
        "../node_modules/tether/dist/js/tether.js",
        "../node_modules/bootstrap/dist/js/bootstrap.min.js",
        "script.js"
    ]

sau đó, tạo một script.js

$("[data-toggle=tooltip]").tooltip();

bây giờ khởi động lại máy chủ của bạn.


phiên bản góc sai, câu hỏi ban đầu là về AngularJS không phải Angular
Jose Luis Berrocal.

0

Vì chức năng chú giải công cụ, bạn phải nói với angleJS rằng bạn đang sử dụng jQuery.

Đây là chỉ thị của bạn:

myApp.directive('tooltip', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            element.on('mouseenter', function () {
                jQuery.noConflict();
                (function ($) {
                    $(element[0]).tooltip('show');
                })(jQuery);
            });
        }
    };
});

và đây là cách sử dụng chỉ thị:


<a href="#" title="ToolTip!" data-toggle="tooltip" tooltip></a>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.