2015-12-08 13 views
6

Tôi đã biết cách hoạt động của tính năng chuyển đổi (chỉ trong mức đầu tiên tôi đoán), bUt Tôi có câu hỏi về phạm vi của mục được nhúng trong lồng nhau.Nested - transcluded items - làm rõ phạm vi?

Ok vì vậy tôi có mã này:

<body ng-app="docsTabsExample" ng-controller="ctrl"> 
    <my-tabs> 
    <my-pane title="Hello"> 
     <h4>Hello , The value of "i" is => {{i}}</h4> 
    </my-pane> 
    </my-tabs> 
</body> 

Về cơ bản tôi có một controller, <my-tabs><my-pane >.

Nhìn vào myTabs chỉ:

.directive('myTabs', function() 
    { 
     return { 
      restrict: 'E', 
      transclude: true, 
      scope: 
      {}, 
      controller: ['$scope', function($scope) 
      { 
       $scope.i = 2; 
      }], 
      template: '<div ng-transclude></div>' 
     }; 
    }) 

Tôi biết rằng nội dung của Chỉ thị sẽ có quyền truy cập vào phạm vi các ngoài chỉ thị của

Vì vậy, phần màu vàng sẽ được tiếp cận với bên ngoài phạm vi (là phạm vi điều khiển chính):

enter image description here

Đây là mã cho myPane chỉ: Chương trình

.directive('myPane', function() 
    { 
     return { 
      require: '^myTabs', 
      restrict: 'E', 
      transclude: true, 
      scope: 
      { 
      }, 
      controller: function($scope) 
      { 
       $scope.i = 4; //different value 
      }, 
      template: '<div ng-transclude></div>' 
     }; 
    }) 

bắt đầu với:

.controller('ctrl', function($scope) 
{ 
    $scope.i = 1000; 
}) 

Đầu ra của chương trình là:

Xin chào, Giá trị của "i "is => 1000

Nhưng

Theo tài liệu: myPane's dữ liệu nhúng nên có quyền truy cập đến phạm vi bên ngoài của các chỉ thị đó là myTabs chỉ thị trong đó có giá trị i=2.

Nhưng myPane có bị cô lập phạm vi vì vậy nó KHÔNG kế thừa phạm vi từ myTabs.

Câu hỏi

Vì vậy, nó đi một cấp hơn cao để phạm vi của bộ điều khiển để có được i=1000 ?? (Làm rõ, tôi không hỏi làm thế nào tôi có thể làm cho i nhận được một giá trị khác - Tôi hỏi tại sao/làm thế nào nó có giá trị là 1000).

Tôi có nghĩa là phân cấp phạm vi trông như thế nào ở đây?

Có phải như thế này không?

  controller's scope 
       | 
     +--------+---------+ 
     |     | 
    myTabs's    mypanes's 
transcluded   transcluded 
data's scope   data's scope   

các tài liệu nói:

Tùy chọn transclude thay đổi cách phạm vi được lồng nhau. Nó làm cho nó để nội dung của một chỉ thị transcluded có bất kỳ phạm vi nào là bên ngoài chỉ thị, thay vì bất kỳ phạm vi nào ở bên trong. Trong làm như vậy, nó cung cấp cho các nội dung truy cập vào phạm vi bên ngoài.

Nhưng phạm vi nào bên ngoài của chỉ thị myPAne có?

Nói cách khác, tại sao/cách hiện i=1000?

FULL PLUNKER

EDIT TỪ OP SAU ĐÁP

Sau khi cài đặt và cấu hình kính tiềm vọng (từ @MarkRajcok) bây giờ tôi có thể nhìn thấy nó bằng mắt:

enter image description here

+2

Cả myTab và myPane có 'transclude: true'. myPane được lồng trong myTab. Bạn đang đưa myPane phạm vi myTab, và sau đó myTab phạm vi của ctrl, cung cấp cho myPane phạm vi của ctrl. – jperezov

Trả lời

1

Từ các tài liệu trên $compile

Khi bạn gọi hàm transclude, nó trả về một đoạn DOM là được giới hạn trước cho phạm vi chuyển đổi. Phạm vi này là đặc biệt, ở chỗ nó là một đứa trẻ trong phạm vi của chỉ thị (và do đó bị phá hủy khi phạm vi chỉ thị của bị phá hủy) nhưng nó thừa kế các thuộc tính của phạm vi mà từ đó nó được chụp.

Chánh Hierarchy (từ $$ childTail) giống như:

-1 (root) 
--2 (ctrl) 
---3 mytab 
----4 ($$transcluded = true) 
------5 mypane 
--------6 ($$transcluded = true) 

nguyên mẫu Hierarchy là loại tương tự (ảnh chụp màn hình từ AngularJS batarang) -

ng-transclude proto hierarchy

Cập nhật plunker với phạm vi của id in trong giao diện điều khiển nên cung cấp cho bạn một đặt cược ý tưởng.

Tại sao chúng khác nhau, tôi không chắc lắm. Ai đó có thể ném ánh sáng vào điều này.

Tại sao giá trị là 1000. nó vì i cần phải được cung cấp như một hai chiều thuộc tính = nên phạm vi đứa trẻ có thể sửa đổi nó. Tôi đã cập nhật plunker ở trên, bạn có thể thấy bây giờ giá trị đáp ứng để thay đổi trong bộ điều khiển pane.

Thông tin thêm về phạm vi nhúng -
Confused about Angularjs transcluded and isolate scopes & bindings
https://github.com/angular/angular.js/wiki/Understanding-Scopes

+0

Tại sao bạn thêm i vào phạm vi bị cô lập? Câu hỏi của tôi không có. Ngoài ra - trong plunker của bạn - bạn có thể vui lòng giải thích những gì là "mypane cha mẹ 4"? Tôi biết rằng cả mytabs và mypane đều có phạm vi riêng biệt (khác biệt). nhưng 'mypane parent 4' là gì? Cha mẹ của mypane là gì? –

+0

Phạm vi được chuyển đổi là phạm vi đặc biệt. Trong trường hợp trên - 'mypane parent 4' là phạm vi được chuyển đổi. Tôi đã cập nhật bài đăng với một liên kết giải thích phạm vi được chuyển đổi. –

+0

Nhưng câu hỏi của tôi có 2 mặt hàng được nhúng, vậy tại sao tôi chỉ nhìn thấy mặt hàng thứ 4? –

Các vấn đề liên quan