Bạn có thể ghi đè các mẫu cụ thể trong AngularUI Bootstrap không?


88

Tôi tò mò nếu có cách nào để ghi đè các mẫu cụ thể, đơn lẻ từ tệp ui-bootstrap-tpls. Phần lớn các mẫu mặc định phù hợp với nhu cầu của tôi, nhưng có một số mẫu cụ thể mà tôi muốn thay thế mà không cần trải qua toàn bộ quá trình lấy tất cả các mẫu mặc định và chuyển chúng lên phiên bản không phải tpls.


1
Tôi cũng thấy mình đang trang trí $modaldịch vụ để có thêm khả năng cấu hình mà không (hy vọng) tạo ra quá nhiều đau đầu về bảo trì. $provide.decorator('$modal'... Trong trường hợp của tôi, tôi không muốn hiển thị modalWindowphần tử. Không bao giờ. Tôi chỉ là không sử dụng nó, và đây là điều tốt nhất tôi có thể nghĩ ra. Tôi muốn nghe một cách tốt hơn nếu ai đó có nó.
bodine

Câu trả lời:


123

Có, các lệnh từ http://angular-ui.github.io/bootstrap có khả năng tùy biến cao và rất dễ dàng ghi đè một trong các mẫu (và vẫn dựa vào các mẫu mặc định cho các lệnh khác).

Nó là đủ để cung cấp $templateCache, hoặc cho nó ăn trực tiếp (như được thực hiện trong ui-bootstrap-tplstệp) hoặc - có lẽ đơn giản hơn - ghi đè một mẫu bằng cách sử dụng <script>chỉ thị ( doc ).

Dưới đây là một ví dụ tiếp theo mà tôi đang thay đổi mẫu của cảnh báo để hoán đổi xcho Close:

<!doctype html>
<html ng-app="plunker">
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js"></script>
    <script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.4.0.js"></script>
    <script src="example.js"></script>
    <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">

    <script id="template/alert/alert.html" type="text/ng-template">
      <div class='alert' ng-class='type && "alert-" + type'>
          <button ng-show='closeable' type='button' class='close' ng-click='close()'>Close</button>
          <div ng-transclude></div>
      </div>
    </script>
  </head>

  <body>
    <div ng-controller="AlertDemoCtrl">
      <alert ng-repeat="alert in alerts" type="alert.type" close="closeAlert($index)">                     
        {{alert.msg}}
      </alert>
      <button class='btn' ng-click="addAlert()">Add Alert</button>
    </div>
  </body>
</html>

Trực tiếp plunker: http://plnkr.co/edit/gyjVMBxa3fToYTFJtnij?p=preview


19
Tôi thích câu trả lời này. Tôi không thích thực tế là nó không có trong trang tài liệu của Angular UI và tôi đã mất khá nhiều thời gian để tìm ra cách thực hiện một cái gì đó đơn giản như hiển thị một phương thức.
Trí Vương

2
Tài liệu @BruceBanner và các ví dụ làm việc vững chắc là hai điểm yếu lớn nhất của Angular UI. Dự án tuyệt vời nhưng nó cần một số tình yêu dịu dàng của nhà phát triển.
Robin van Baalen

1
@RobinvanBaalen đây là một tính năng góc-js (không góc-ui), nó đã được ghi lại trong tài liệu chính thức js góc của
Vikki

Vui lòng kiểm tra câu trả lời @JcT về $ cung cấp.decorator, vì đó là cách Angular (cách tốt trong trường hợp này) để ghi đè các mẫu chỉ thị. Và nó khá dễ dàng. Chỉ thêm / ghi đè một mẫu vào $ templateCache không thực sự là cách tốt nhất.
John Bernardsson,

@John Tôi không chắc bạn nhận được những thứ từ đâu "đó là cách Angular (cách tốt trong trường hợp này)" và "chỉ thêm / ghi đè một mẫu vào $ templateCache không thực sự là phương pháp hay nhất" nhưng là một trong những góc cạnh- ui và những người bảo trì góc cạnh Tôi có thể đảm bảo với bạn rằng không có gì sai khi ghi đè các mẫu. Trừ khi bạn đã có vấn đề cụ thể để chia sẻ ...
pkozlowski.opensource

79

Sử dụng $provide.decorator

Sử dụng $provideđể trang trí chỉ thị tránh sự cần thiết phải trực tiếp lộn xộn xung quanh $templateCache.

Thay vào đó, hãy tạo html mẫu bên ngoài của bạn như bình thường, với bất kỳ tên nào bạn muốn và sau đó ghi đè chỉ thị templateUrlđể trỏ vào nó.

angular.module('plunker', ['ui.bootstrap'])
  .config(['$provide', Decorate]);

  function Decorate($provide) {
    $provide.decorator('alertDirective', function($delegate) {
      var directive = $delegate[0];

      directive.templateUrl = "alertOverride.tpl.html";

      return $delegate;
    });
  }

Fork của pkozlowski.opensource 's plunkr: http://plnkr.co/edit/RE9AvUwEmKmAzem9mfpI?p=preview

(Lưu ý rằng bạn phải thêm hậu tố 'Chỉ thị' vào tên chỉ thị mà bạn định trang trí. Ở trên, chúng tôi đang trang trí alertchỉ thị của UI Bootstrap , vì vậy chúng tôi sử dụng tên này alertDirective.)

Vì bạn có thể thường muốn làm nhiều việc hơn là chỉ ghi đè templateUrl, điều này cung cấp một điểm khởi đầu tốt để từ đó mở rộng thêm chỉ thị, ví dụ: bằng cách ghi đè / gói liên kết hoặc hàm biên dịch ( ví dụ ).


9
Đây là giải pháp chính xác và tuân theo các phương pháp hay nhất về góc cạnh. Bạn KHÔNG BAO GIỜ nên sử dụng chuỗi để tạo HTML, cũng như không nên đưa nó vào tệp index.html một cách rõ ràng nơi bạn đưa các tập lệnh của bên thứ ba vào. Cảm ơn @JcT!
TommyMac

2
Xin chào, là alertDirectivemột từ khóa? nếu có, từ khóa là Tabsgì? Tôi đang cố gắng làm điều tương tự trên các tab, nhưng tôi đã xem qua alert.js và không thấy chúng alertDirectiveở đâu trong đó.
codenamezero

4
Angjs $compileProvidergắn hậu tố 'Chỉ thị' vào tên chỉ thị của bạn khi bạn đăng ký nó ( $filterProvidertương tự với hậu tố 'Bộ lọc'); đối với hầu hết các mục đích, điều này là vô hình, nhưng khi trang trí, bạn sẽ cần thêm hậu tố này vào chỉ thị mà bạn định nhắm mục tiêu. Ví dụ: tabDirectivehoặc tabsetDirective, v.v. Không được ghi lại chính xác ở bất kỳ đâu mà tôi có thể tìm thấy, nhưng đây là tham chiếu đến hành vi tương tự cho $filterProviderít nhất: docs.angularjs.org/api/ng/provider/$filterProvider
JcT

2
Cảm ơn rất nhiều @JcT, một câu trả lời tuyệt vời. Đây là cách chính xác để đi. Và, như bạn nói, một điểm khởi đầu tốt để "trang trí" các chỉ thị của bên thứ 3 :)
John Bernardsson

1
@ValeraTumash: Xin lỗi vì trả lời muộn. Vâng, tôi nghĩ rằng cấu hình của bạn sẽ bị che khuất; tuy nhiên, từ Angular v1.3, tôi tin rằng bạn có thể cung cấp một function(element, attributes)cho templateUrl. Bạn có thể sử dụng điều này cho một số hành vi động (trả về hàm templateUrl gốc hoặc chuỗi url của riêng bạn tùy thuộc vào thuộc tính, v.v.). Tuy nhiên, ui.bootstrap hiện cũng sử dụng chức năng tương tự này để cho phép bạn cung cấp một template-urlthuộc tính trên một chỉ thị, vì vậy bạn cũng có thể sử dụng nó nếu bạn sẵn sàng cung cấp trực tiếp đường dẫn mẫu thông qua thuộc tính phần tử chỉ thị.
JcT

27

Câu trả lời từ pkozlowski.opensource thực sự hữu ích và đã giúp tôi rất nhiều! Tôi đã điều chỉnh nó trong điều kiện của mình để có một tệp xác định tất cả các ghi đè mẫu góc cạnh của tôi và tải JS bên ngoài để giảm kích thước tải xuống.

Để thực hiện việc này, hãy chuyển đến cuối tệp js nguồn ui-bootstrap góc cạnh (ví dụ ui-bootstrap-tpls-0.6.0.js) và tìm mẫu bạn quan tâm. Sao chép toàn bộ khối xác định mẫu và dán vào tệp JS ghi đè của bạn.

ví dụ

angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) {
  $templateCache.put("template/alert/alert.html",
     "      <div class='alert' ng-class='type && \"alert-\" + type'>\n" +
     "          <button ng-show='closeable' type='button' class='close' ng-click='close()'>Close</button>\n" +
     "          <div ng-transclude></div>\n" +
     "      </div>");
}]);

Sau đó, chỉ cần bao gồm tệp ghi đè của bạn sau ui-bootstrap và bạn đạt được kết quả tương tự.

Phiên bản Forked của pkozlowski.opensource 's liệng http://plnkr.co/edit/iF5xw2YTrQ0IAalAYiAg?p=preview


1
Tôi sử dụng cùng một mẫu này, và mặc dù nó hoạt động; Tôi thực sự ước có một cách tốt hơn. Tôi nghĩ rằng tôi thích cấu hình hơn để làm tắc nghẽn.
bodine

7

Bạn có thể sử dụng template-url="/app/.../_something.template.html"để ghi đè mẫu hiện tại cho chỉ thị đó.

(Ít nhất hoạt động trong Accordion Bootstrap.)

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.