2015-02-12 23 views
7

Hãy xem xét hai chỉ thị lồng nhau với phạm vi cô lập:AngularJS chỉ cha mẹ giao tiếp với chỉ thị con

<dctv1> 
    <dctv2></dctv2> 
<dctv1> 

Nếu tôi muốn dctv2 để nói chuyện với dctv1 tôi có thể lựa chọn:

  1. tôi có thể yêu cầu bộ điều khiển của dctv1 trong định nghĩa của dctv2 bằng cách sử dụng require:'^dctv1'
  2. Tôi có thể gọi biểu thức trên phạm vi gốc với trình bao bọc <dctv2 callParent="hello()"></dctv2>scope:{callParent:'&'}
  3. Tôi cũng có thể sử dụng $scope.$emit trong dctv2 nhưng sau đó tất cả phạm vi gốc sẽ nghe thấy thông báo.

Bây giờ tôi muốn dctv1 để nói chuyện với dctv2.

  1. Cách duy nhất tôi có thể thực hiện việc này là sử dụng $scope.$broadcast, nhưng sau đó tất cả trẻ em sẽ nghe thấy.

Bằng cách nói ở đây, tôi muốn gọi hàm hoặc tương tự. Không muốn thiết lập đồng hồ làm tắc nghẽn đường tiêu hóa.

Làm cách nào để tạo dctv1 thông báo dctv2 một cách tốt nhất, làm cho chúng được ghép nối lỏng lẻo? Tôi chỉ có thể loại bỏ dctv2 mà không có lỗi.

+0

Nếu bạn chọn sự kiện. Bạn có thể gọi preventDefault và stopPropagation. Trong thực tế, sự kiện $ là một thể hiện của sự kiện jQuery. – Raulucco

Trả lời

0

Bạn có thể quản lý nó bằng cách sử dụng id cho mỗi trẻ em phải được chuyển cho phụ huynh; phụ huynh sẽ phát lại sự kiện bằng cách sử dụng id đó: đứa trẻ sẽ thực hiện hành động chỉ khi id được truyền từ cha/mẹ là của riêng nó.

Tạm biệt

0

Một cách là làm cho một Dịch vụ/Nhà máy sẽ giao tiếp với các bộ điều khiển mà bạn muốn.

Ví dụ, đây là một Nhà máy getter/setter

.factory('factoryName', function() { 

    var something = "Hello"; 

    return { 

     get: function() { 
      return something; 
     }, 

     set: function (keyword) { 
      something = keyword; 
      return something ; 
     } 
    }; 

}]) 

Và sau đó trong bộ điều khiển của bạn:

.controller('controllerOne', ['factoryName', function (factoryName) { 
    $scope.test = factoryName.get(); 
}]); 

.controller('controllerTwo', ['factoryName', function (factoryName) { 
    $scope.test = factoryName.get(); 
    $scope.clickThis = function (keyword) { 
     factoryName.set(keyword); 
    }; 
}]); 

tôi khuyên bạn nên đọc lên về vấn đề này: Can one controller call another?

3

Đưa hãy xem AngularJS NgModelController để biết một số ý tưởng.

Mỗi chỉ thị <dctv2> sẽ yêu cầu <dvtv1> để có bộ điều khiển được tiêm. Sau đó, bạn có thể thêm đối tượng hoặc gọi lại vào thuộc tính của bộ điều khiển đó và loại bỏ chúng khi <dctv2> bị hủy.

<dvtv1> sẽ không nói chuyện trực tiếp với trẻ em, nhưng sẽ kích hoạt các cuộc gọi lại bị ràng buộc với các thuộc tính của nó.

Ví dụ;

NgModelController$parsers$formatters là một mảng gọi lại hàm. Bạn đẩy các hàm của riêng bạn vào mảng để mở rộng hành vi của trình điều khiển đó.

Khi NgModelController thực hiện xác thực đầu vào, về cơ bản nó nói chuyện với các chỉ thị khác thông qua các thuộc tính này.

+0

Tôi hỗ trợ ý tưởng chính với cuộc gọi lại (mỗi cá thể dctv2 sẽ đăng ký gọi lại riêng của nó), nhưng tôi sẽ để NgModelController sang một bên. – Benjamin

+0

@Benjamin bạn có thể xây dựng ý tưởng của mình hơn nữa không? –

+0

@ Wei-jye Tôi không nghĩ rằng 'NgModelController' là một ví dụ tốt ở đây. Tôi muốn đề nghị sử dụng 'require: '^ dctv1'' để có được một tham chiếu đến bộ điều khiển cha mẹ. Sau đó, đăng ký với cha mẹ đó ('dctv1.registerChild (self)'). Sau đó, dctv1 biết con của nó và có thể tương tác với chúng. – Benjamin

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