Làm cách nào để sử dụng tính năng 'thay thế' cho các chỉ thị AngularJS tùy chỉnh?


91

Tại sao replace=truehoặc replace=falsekhông có bất kỳ tác động nào trong đoạn mã dưới đây?

Tại sao "một số nội dung hiện có" không được hiển thị khi Replace = false?

Hoặc nói một cách khiêm tốn hơn, bạn có thể vui lòng giải thích replace=true/falsetính năng trong chỉ thị là gì và cách sử dụng nó không?

Thí dụ

JS / Angular:

<script>
    angular.module('scopes', [])
          .controller('Ctrl', function($scope) {
                $scope.title = "hello";

          })
          .directive('myDir', function() {
            return {
              restrict: 'E',
              replace: true,
              template: '<div>{{title}}</div>'
            };
      });
</script>

HTML:

<div ng-controller="Ctrl">
    <my-dir><h3>some existing content</h3></my-dir>
</div>

Xem nó trong Plunker tại đây:

http://plnkr.co/edit/4ywZGwfsKHLAoGL38vvW?p=preview


2
@georgeawg đã đánh dấu đây là bản sao của một câu hỏi khác đã được hỏi / trả lời muộn hơn câu hỏi này.
Kaya Toast

Câu trả lời:


189

Khi bạn có, replace: truebạn sẽ nhận được đoạn DOM sau:

<div ng-controller="Ctrl" class="ng-scope">
    <div class="ng-binding">hello</div>
</div>

trong khi, replace: falsebạn có được điều này:

<div ng-controller="Ctrl" class="ng-scope">
    <my-dir>
        <div class="ng-binding">hello</div>
    </my-dir>
</div>

Vì vậy, thuộc replacetính trong chỉ thị đề cập đến việc liệu phần tử mà chỉ thị đang được áp dụng ( <my-dir>trong trường hợp đó) có nên giữ nguyên hay không ( replace: false) và mẫu của chỉ thị phải được thêm vào làm con của nó,

HOẶC LÀ

phần tử mà chỉ thị đang được áp dụng phải được thay thế ( replace: true) bằng mẫu của chỉ thị.

Trong cả hai trường hợp, phần tử con (mà chỉ thị đang được áp dụng) sẽ bị mất. Nếu bạn muốn duy trì nội dung gốc / phần tử con, bạn sẽ phải loại bỏ nó. Lệnh sau sẽ thực hiện điều đó:

.directive('myDir', function() {
    return {
        restrict: 'E',
        replace: false,
        transclude: true,
        template: '<div>{{title}}<div ng-transclude></div></div>'
    };
});

Trong trường hợp đó, nếu trong mẫu của chỉ thị bạn có một phần tử (hoặc các phần tử) có thuộc tính ng-transclude, nội dung của nó sẽ được thay thế bằng nội dung gốc của phần tử (mà chỉ thị đang được áp dụng).

Xem ví dụ về chuyển đổi http://plnkr.co/edit/2DJQydBjgwj9vExLn3Ik?p=preview

Xem phần này để đọc thêm về chuyển đổi.


6
Đây là một lời giải thích đơn giản tuyệt vời. Và cảm ơn rất nhiều vì đã làm rõ quá trình chuyển đổi.
Kaya Toast

Quan trọng hơn, tại sao nó không được giải thích tại docs.angularjs.org/guide/directive và tại sao câu trả lời này không liên kết đến câu trả lời chắc chắn về chủ đề?
Trindaz

3
@Trindaz replacekhông được dùng nữa kể từ AngularJS v1.3 ( liên kết ).
Tonči D.

33

replace:true không được chấp nhận

Từ Tài liệu:

replace ([DEPRECATED!], Sẽ bị xóa trong bản phát hành chính tiếp theo - tức là v2.0)

chỉ định những gì mẫu sẽ thay thế. Mặc định là false.

  • true - mẫu sẽ thay thế phần tử của chỉ thị.
  • false - mẫu sẽ thay thế nội dung của phần tử của chỉ thị.

- API chỉ thị toàn diện AngularJS

Từ GitHub:

Caitp-- Nó không được dùng nữa vì có những vấn đề đã biết, rất ngớ ngẩn replace: true, một số vấn đề trong số đó thực sự không thể được khắc phục một cách hợp lý. Nếu bạn cẩn thận và tránh những vấn đề này, thì bạn sẽ có nhiều quyền lực hơn, nhưng vì lợi ích của người dùng mới, sẽ dễ dàng hơn nếu bạn chỉ nói với họ "điều này sẽ khiến bạn đau đầu, đừng làm vậy".

- AngularJS Issue # 7636


Cập nhật

Lưu ý: replace: truekhông được dùng nữa và không được khuyến khích sử dụng, chủ yếu là do các vấn đề được liệt kê ở đây. Nó đã bị loại bỏ hoàn toàn trong Angular mới.

Vấn đề với thay thế: true

Để biết thêm thông tin, hãy xem


2
Tôi tiếp tục đọc rằng điều này được cho là sẽ được hỗ trợ không chính thức trong Angular 2, nhưng tôi không thể tìm ra cách kích hoạt nó. Ai đó có thể cho tôi biết cú pháp là gì không?
defos1

@devios Tôi cần thứ như vậy cho các thành phần mdl của mình nhưng hiện đang sử dụng remove-hostcách giải quyết khác stackoverflow.com/questions/34280475/… nếu bạn tìm hiểu về cách kích hoạt replace: truetrong A2, hãy cho chúng tôi biết.
kuncevic.dev
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.