簡體   English   中英

AngularJS父指令與child指令通信

[英]AngularJS parent directive communicate with child directive

考慮兩個帶有隔離范圍的嵌套指令:

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

如果我想dctv2dctv1我有可能會選擇:

  1. 我可能需要的控制器dctv1中的定義dctv2使用require:'^dctv1'
  2. 我可以使用包裝器<dctv2 callParent="hello()"></dctv2>scope:{callParent:'&'}調用父作用域上的表達式scope:{callParent:'&'}
  3. 我也可以在dctv2使用$scope.$emit ,但是所有父作用域都會聽到消息。

現在我想dctv1交談dctv2

  1. 我可以實現這一目標的唯一方法是使用$scope.$broadcast ,但隨后所有孩子都會聽到。

通過這里談話,我的意思是稱為函數或類似函數。 不想設置堵塞digestloop的手表。

如何讓dctv1以最佳方式通知dctv2 ,使它們松散耦合? 我應該能夠刪除dctv2而不會出錯。

看看AngularJS NgModelController的一些想法。

每個<dctv2>指令都需要<dvtv1>來注入它的控制器。 然后,您可以將對象或回調添加到該控制器的屬性,並在<dctv2>被銷毀時將其刪除。

<dvtv1>不會直接與孩子交談,但會觸發綁定到其屬性的回調。

例如;

NgModelController$parsers$formatters ,它們是函數回調數組。 您將自己的函數推送到數組中以擴展該控制器的行為。

NgModelController執行輸入驗證時,它基本上通過這些屬性與其他指令對話。

我建議使用角度服務 這樣,您就可以將行為分離為一個或多個服務。

看看這個: AngularJS:如何觀察服務變量?

一種方法是建立一個服務/工廠,與您想要的控制器進行通信。

例如,這是一個getter / setter工廠

.factory('factoryName', function () {

    var something = "Hello";

    return {

        get: function () {
            return something;
        },

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

}])

然后在你的控制器中:

.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);
    };
}]);

我建議閱讀: 一個控制器可以調用另一個嗎?

您可以使用必須傳遞給父級的每個子級的id來管理它; 父節點將使用該id廣播事件:只有從父節點傳遞的id是他自己的id時,子節點才會執行操作。

再見

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM