指令之间的AngularJS通信

我是Angular.js的新手,我的应用程序需要指令之间的某些通信,我阅读了一些有关链接和需求的文档,但无法确切了解其工作原理。


对于一个简单的例子,我有:live小提琴:http : //jsfiddle.net/yw235n98/5/


2个指令:firstDir,secondDir ::带有一些数据

firstDir具有单击功能,它将更改数据值

当firsDir单击功能被触发时,我也想在secondDir中更改数据。

HTML:


<body ng-app="myApp">

First Directive :   

<first-dir >

    <h3>{{firstCtrl.data}}</h3>

    <button ng-click="firstCtrl.set('NEW VALUE')">Change Value</button>

</first-dir>

Second Directive : 

<second-dir>

    <h3>{{secondCtrl.data}}</h3>

</second-dir>

Javascript:


(function(){

    var app = angular.module('myApp', []);


    app.directive("firstDir", function(){

        return {

            restrict : 'E',

            controller : function(){        

                this.data = 'init value';

                this.set = function(value){

                    this.data = value;

                    // communication with second Directive ???

                }       

            },

            controllerAs : 'firstCtrl'

        };  

    });


    app.directive("secondDir", function(){

        return {

            restrict : 'E',

            controller : function(){        

                this.data = 'init value';   

            },

            controllerAs : 'secondCtrl'

        };  

    });

})();


繁花如伊
浏览 649回答 3
3回答

弑天下

在您的示例中,指令结构不是父子结构。因此,您无法通过其控制器共享方法。我会用$rootScope.$broadcast。(请参阅DOCS)一个指令调用:$rootScope.$broadcast('someEvent', [1,2,3]);第二条指令侦听:&nbsp;scope.$on('someEvent', function(event, mass) {&nbsp; &nbsp; console.log(mass)}&nbsp; );固定指令:app.directive("firstDir", function ($rootScope) {&nbsp; &nbsp; return {&nbsp; &nbsp; &nbsp; &nbsp; restrict: 'E',&nbsp; &nbsp; &nbsp; &nbsp; link: function (scope, element, attrs) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scope.dataToPass = 'empty';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scope.doClick = function (valueToPass) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scope.dataToPass = valueToPass;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $rootScope.$broadcast('someEvent', {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data: valueToPass&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };});app.directive("secondDir", function () {&nbsp; &nbsp; return {&nbsp; &nbsp; &nbsp; &nbsp; restrict: 'E',&nbsp; &nbsp; &nbsp; &nbsp; link: function (scope, element, attrs) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scope.receivedData = 'none';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scope.$on('someEvent', function (event, result) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scope.receivedData = result.data;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }});

饮歌长啸

我正在使用的是导出指令控制器。假设我有以下指令:app.directive('mainDirective', function () {&nbsp; return {&nbsp; &nbsp; require: 'mainDirective'&nbsp; &nbsp; restrict: 'E',&nbsp; &nbsp; scope: {&nbsp; &nbsp; &nbsp; controller: '='&nbsp; &nbsp; },&nbsp; &nbsp; controller: [&nbsp; &nbsp; &nbsp; '$scope',&nbsp; &nbsp; &nbsp; function ($scope) {&nbsp; &nbsp; &nbsp; &nbsp; // controller methods&nbsp; &nbsp; &nbsp; &nbsp; this.doSomething = function () { ... },&nbsp; &nbsp; &nbsp; &nbsp; $scope.controller = this&nbsp; &nbsp; &nbsp; &nbsp; return this&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; ],&nbsp; &nbsp; link: function (scope, element, attrs, mainDirective) {&nbsp; &nbsp; &nbsp; // some linking stuff&nbsp; &nbsp; }&nbsp; }});我的html看起来像这样:<main-directive controller="mainDirective"></main-directive><sub-directive main-directive="mainDirective"></sub-directive>如果我想从子指令控制主指令,我可以轻松地从它的作用域中获取它并做我想做的任何事情...app.directive('subDirective', function () {&nbsp; return {&nbsp; &nbsp; restrict: 'E',&nbsp; &nbsp; scope: {&nbsp; &nbsp; &nbsp; mainDirective: '='&nbsp; &nbsp; }&nbsp; &nbsp; link: function (scope, element, attrs) {&nbsp; &nbsp; &nbsp; // do something with main directive&nbsp; &nbsp; &nbsp; scope.mainDirective.doSomething();&nbsp; &nbsp; }&nbsp; }});
打开App,查看更多内容
随时随地看视频慕课网APP