当前位置: 首页 > 面试题库 >

指令之间的AngularJS通信

万铭
2023-03-14
问题内容

我是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'
        };  
    });
})();

问题答案:

您可以使用事件方法在它们之间进行通信的一种方式。

一个指令可以在rootscope上发出事件,然后任何人都可以侦听。您可以使用$rootScope.$emit$rootScope.$broadcast发布带有html" target="_blank">数据的事件,并用于$scope.$on监听事件。就您而言,您也可以这样做$scope.$emit

app.directive("firstDir", function(){
    return {
        restrict : 'E',
        controller : function($scope){        
            this.data = 'init value';

            this.set = function(value){
             //EMIT THE EVENT WITH DATA
              $scope.$emit('FIRST_DIR_UPDATED', value);
                this.data = value;
                // communication with second Directive ???
            }       
        },
        controllerAs : 'firstCtrl'
    };  
});

app.directive("secondDir", function(){
    return {
        restrict : 'E',
        controller : function($scope){    
          var _that = this;
          //LISTEN TO THE EVENT 
          $scope.$on('FIRST_DIR_UPDATED', function(e, data){
                 _that.data = data;
          });
          this.data = 'init value';   
        },
        controllerAs : 'secondCtrl'
    };  
});

演示
DEMO2

________________

现在讲,有时确实需要注入$rootScope只是为了将事件启用到应用程序中的其他节点。相反,您可以在您的应用程序中轻松构建一个发布/订阅机制,并利用原型继承。

在这里,我将在应用初始化期间添加2种方法publishsubscribe$rootScope's原型上。所以,任何儿童范围或隔离的范围将这些方法可用,沟通会更容易因此无需担心是否使用$emit$broadcast我是否需要注入$rootscope从隔离范围的指令等进行通信

app.service('PubSubService', function () {


   return {Initialize:Initialize};

     function Initialize (scope) {
        //Keep a dictionary to store the events and its subscriptions
        var publishEventMap = {};

         //Register publish events
          scope.constructor.prototype.publish =  scope.constructor.prototype.publish 
           || function () {
                var _thisScope = this,
                    handlers, 
                    args, 
                    evnt;
                //Get event and rest of the data
                args = [].slice.call(arguments);
                evnt = args.splice(0, 1);
                //Loop though each handlerMap and invoke the handler
                angular.forEach((publishEventMap[evnt] || []), function (handlerMap) {
                    handlerMap.handler.apply(_thisScope, args);
                })
            }

         //Register Subscribe events
         scope.constructor.prototype.subscribe = scope.constructor.prototype.subscribe 
            || function (evnt, handler) {
                var _thisScope = this,
                    handlers = (publishEventMap[evnt] = publishEventMap[evnt] || []);

                //Just keep the scopeid for reference later for cleanup
                handlers.push({ $id: _thisScope.$id, handler: handler });
              //When scope is destroy remove the handlers that it has subscribed.  
             _thisScope.$on('$destroy', function () {
                for(var i=0,l=handlers.length; i<l; i++){
                  if (handlers[i].$id === _thisScope.$id) {
                        handlers.splice(i, 1);
                        break;
                    }
                }
            });
        }

    }
}).run(function ($rootScope, PubSubService) {
    PubSubService.Initialize($rootScope);
});

而且您可以在应用程序中的任何位置发布事件而无需rootScope。

$scope.publish('eventName', data);

并在应用程序的任何地方收听,而无需担心使用$rootScopeor $emit$broadcast:-

$scope.subscribe('eventName', function(data){
    //do somthing
});

演示-PubSub



 类似资料:
  • 问题内容: 我正在写一个创建mp3 /音频播放器的指令。问题是一页中可以有许多音频播放器。我想做的是当一个正在播放而您又开始播放另一个音乐时,当前正在播放的音乐会暂停。如何使用角度指令实现这一目标? 提前致谢! 问题答案: 您也可以执行$ rootScope。$ broadcast 事件,例如。所有指令都可以预订此事件,并且它们可以通过停止自身来对此事件做出反应。您需要做的一件事就是传递有关正在启

  • 问题内容: 在指令内部创建 隔离作用域 使我们可以将 外部作用域 映射到 内部作用域 。我们已经看到了六种映射到属性的不同方法: = attr &attr @attr = 和 @ 这些作用域映射选项分别做什么? 问题答案: 这可能会造成混淆,但是希望有一个简单的示例可以阐明这一点。首先,让我们将模型绑定与行为分开。 这是一个小提琴,应该有助于将它们联系在一起:http : //jsfiddle.n

  • 本文向大家介绍AngularJS入门教程之AngularJS指令,包括了AngularJS入门教程之AngularJS指令的使用技巧和注意事项,需要的朋友参考一下 熟悉HTML的朋友都知道,HTML有很多属性。比如<a>标签的href属性可以来指定链接的URL地址,<input>标签的type属性可以用来指定input的类型。AngularJS指令就是通过扩展HTML的属性来为 AngularJS

  • 问题内容: 我想可能有许多角度模块连接到一个shellpage中的不同区域。但是AngularJS中的模块可以彼此“交谈”吗?如果是,怎么办? 问题答案: 模块可以通过多种方式进行交互或共享信息 可以将一个模块注入另一个模块,在这种情况下,容器模块可以访问已注入模块的所有元素。如果您查看有角的种子项目,则会为指令,控制器,过滤器等创建模块,就像这样 angular.module(“ myApp”,

  • 主要内容:AngularJS 指令,AngularJS 实例,数据绑定,AngularJS 实例,重复 HTML 元素,AngularJS 实例,AngularJS 实例,ng-app 指令,ng-init 指令,ng-model 指令,ng-repeat 指令,创建自定义的指令,AngularJS 实例,限制使用AngularJS 通过被称为 指令 的新属性来扩展 HTML。 AngularJS 通过内置的指令来为应用添加功能。 AngularJS 允许你自定义指令。 AngularJS 指令

  • 问题内容: 我创建了一个包装jQuery插件的指令,并将该插件的配置对象从控制器传递到指令。(作品) 在配置对象中是一个我想在事件上调用的回调。(作品) 在回调中,我想修改控制器的$ scope上的属性,该属性 不起作用 。Angular无法识别出该属性由于某种原因而发生了变化,这使我相信回调中的$ scope与控制器的$ scope不同。我的问题是我不明白为什么。 有人能指出我正确的方向吗? 单