2013-05-18 33 views
12

Tôi đã biết rằng bạn có thể thiết lập bộ điều khiển trong chỉ thị và các chỉ thị khác có thể gọi các chức năng trên bộ điều khiển đó. Đây là những gì chỉ hiện tại của tôi trông giống như:Thông tin liên lạc chỉ thị trong AngularJS?

app.directive("foobar", function() { 
    return { 
    restrict: "A", 
    controller: function($scope) { 
     $scope.trigger = function() { 
     // do stuff 
     }; 
    }, 
    link: function(scope, element) { 
    // do more stuff 
    } 
    }; 
}); 

tôi biết rằng tôi có thể gọi nó như thế này:

app.directive("bazqux", function() { 
    return { 
    restrict: "A", 
    require: "foobar", 
    link: function(scope, element, attrs, fooBarCtrl) { 
     fooBarCtrl.trigger(); 
    } 
    }; 
}); 

Tuy nhiên, tôi muốn để có thể gọi kích hoạt từ bất kỳ chỉ thị, không chỉ tùy chỉnh của riêng tôi, như sau:

<button ng-click="foobar.trigger()">Click me!</button> 

Nếu điều đó không có tác dụng, có cách nào đưa chỉ thị thứ ba để thực hiện điều đó không? Như thế này?

<button ng-click="trigger()" target-directive="foobar">Click me!</button> 

Cảm ơn!

Trả lời

5

Một cách đơn giản để hoàn thành giao tiếp ứng dụng rộng giữa bất kỳ thành phần sẽ được sử dụng các sự kiện toàn cầu (phát ra từ $ rootScope). Ví dụ:

JS:

app.directive('directiveA', function($rootScope) 
{ 
    return function(scope, element, attrs) 
    { 
     // You can attach event listeners in any place (controllers, too) 

     $rootScope.$on('someEvent', function() 
     { 
      alert('Directive responds to a global event'); 
     }); 
    }; 
}); 

HTML:

<button ng-click="$emit('someEvent')">Click me!</button> 

Tại đây bạn sẽ phát ra một sự kiện từ phạm vi con nhưng nó cuối cùng sẽ đạt được $rootScope và chạy người nghe trước.

Đây là ví dụ trực tiếp: http://plnkr.co/edit/CpKtR5R357tEP32loJuG?p=preview

+0

Điều này thật tuyệt. Làm việc như một say mê! –

+4

Đừng làm điều này, nó sẽ gây ô nhiễm rootscope, tạo một dịch vụ hoặc có thể yêu cầu chỉ thị. –

+0

chỉ ra '$ rootScope' gotchas: http://jsfiddle.net/drzaus/a1gm7q4u/ về cơ bản giống như @ WillemD'haeseleer đã nói, bạn có thể nhận được phản ứng phụ gửi mọi thứ lên/xuống từ' $ rootScope' nếu khác "bị cô lập" phạm vi đang lắng nghe cùng một điều (tức là chỉ thị lặp đi lặp lại hoặc bộ điều khiển) – drzaus

8

Có vẻ như bạn cần dịch vụ góc cạnh. http://docs.angularjs.org/guide/dev_guide.services

Điều này sẽ cho phép bạn chia sẻ chức năng trên các chỉ thị.

Dưới đây là một câu hỏi tương tự: Sharing data between directives

+0

Tôi đã sử dụng dịch vụ, nhưng tôi không biết cách sử dụng chúng để tạo điều kiện liên lạc chéo. bạn có thể cung cấp một ví dụ? –

+0

Chắc chắn, bạn có thể đổ cả hai chỉ thị của bạn cần phải được truyền đạt với nhau trong một jsfiddle? –

+0

Tôi đã tìm ra, nhưng cảm ơn bạn! –

1

Khi nói chuyện trên irc nó bật ra rằng giao tiếp là không cần thiết:

Tôi đã có một chỉ thị thuộc tính hạn chế, thực hiện một số thao tác DOM trên mẹ khi được "kích hoạt"

Một giải pháp là giữ logic bên trong cùng một chỉ thị và chỉ áp dụng thay đổi cho cha mẹ. http://jsfiddle.net/wt2dD/5/

scope.triggerSmthOnParent = function() { 
    element.parent().toggleClass('whatewer'); 
} 
+1

IMO, ng-class nên được sử dụng trong hầu hết (99%) trường hợp khi tên lớp cần phải được thêm vào. –

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