angularjs控制器之间通信,事件通知服务

service要记住一点就是所有的services都是singleton(单例)的,service更多的是做一些业务逻辑,数据交互。当然,利用单例这特点也可以用来做不同控制器间的通信。控制器间的通信也有多种做法:AngularJS控制器controller如何通信?。

利用作用域继承的方式。即子控制器继承父控制器中的内容

基于事件的方式。即$on,$emit,$boardcast这三种方式

服务方式。写一个服务的单例然后通过注入来使用

第一种还是有些局限性,第二种用起来并不太方便(或者个人不习惯),于是利用service实现了基于事件的通知方式。

上代码

//提供给不同控制器的通信
app.factory("EventService", function () {
    var onEventFunc = {};
    return {
        on: function (type, f) {
            //事件绑定
            onEventFunc[type] = f;
        }, trigger: function (type, data) {
            //触发事件
            for (var item in onEventFunc) {
                if (item == type)
                    onEventFunc[item](data);
            }
        }
    }
});

//使用
function test1Controller(EventService) {
    EventService.on("newMess", function (data) {
        //console.log(data);
    });
}
function test2Controller($scope,EventService) {
    $scope.send = function (data) {
        //这里是我在项目中使用的一个例子,当发送了新消息,通知另一个控制器

        //触发事件,通知
        EventService.trigger("newMess", data);
    }
}

可以基于这思路去扩展实现更复杂的业务。

时间: 2024-08-02 06:59:20

angularjs控制器之间通信,事件通知服务的相关文章

AngularJS 控制器通信

指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式 基于scope继承的方式 最简单的让控制器之间进行通信的方法是通过scope的继承.假设有两个控制器Parent.Child,Child 在 Parent 内,那Child 可以称为控制器Parent的子控制器,它将继承父控制器Parent的scope.这样,Child就可以访问到Parent的scope中的所有函数和变量了. 需要注意的是,由于scope的继承是基于Js的原型继

.NET Core 实践:事件通知和异步处理

首先让我们来先看一个例子: 这是一个简单的用户下单购买商品的业务模型,输入端是用户,相关物料有订单和货物,相关的内部服务有业务(订单).财务(支付).仓储(备货)和物流(运输). 从图中我们可以看到,用户首先向业务部门下了一个订单,业务部门根据用户提供的内容生成了一份订单给客户,并要求客户根据订单金额支付费用.此时用户会拿着订单向财务部门付款,财务部门收款后告诉业务部门,此订单的货款已经收到,业务部门通知仓储部门备货,仓储部门备货完成后通知业务部门货物已经准备完毕,再由业务部门通知物流部门去仓库

.NET Core 实践二:事件通知和异步处理

首先让我们来先看一个例子: 这是一个简单的用户下单购买商品的业务模型,输入端是用户,相关物料有订单和货物,相关的内部服务有业务(订单).财务(支付).仓储(备货)和物流(运输). 从图中我们可以看到,用户首先向业务部门下了一个订单,业务部门根据用户提供的内容生成了一份订单给客户,并要求客户根据订单金额支付费用.此时用户会拿着订单向财务部门付款,财务部门收款后告诉业务部门,此订单的货款已经收到,业务部门通知仓储部门备货,仓储部门备货完成后通知业务部门货物已经准备完毕,再由业务部门通知物流部门去仓库

Angular控制器之间的通信

控制器之间的通信 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会影响到子作用域,反之,修改子作用域只会影响子作用域的值,不会影响父作用域上面的值:如果需要父作用域与子作用域共享一个值的话,就需要用到后面一种,即作用域上的值为对象,任何一方的修改都能影响另一方,这是因为在js中对象都是引用类型. 基本类型 function Sandcrawler($scope) {     $scope.locatio

Angularjs controller之间的通信

刚刚看了网上的一些关于控制器之间的通信:然后结合自己项目做了一些,这里主要做的是二个同级之间的controller通信. Html: 1 <html> 2 <script src="http://apps.bdimg.com/libs/angular.js/1.3.9/angular.min.js"></script> 3 <body> 4 <div ng-app="app"> 5 <div ng-c

两个控制器之间的通信

//A控制器中 - (void)toDo{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nearbyToRootVcCommunication) name:@"nearbyToRootVcCommunication" object:nil]; } //当B控制器中的viewDidLoad方法调用时,此方法也会被触发 -(void)nearbyToRootVcCommunication

Prism 4 文档 ---第9章 松耦合组件之间通信

当构建一个大而负责的应用程序时,通用的做法时将功能拆分到离散的模块程序集中.将模块之间的静态引用最小化.这使得模块可以被独立的开发,测试,部署和升级,以及它迫使松散耦合的沟通. 当在模块之间通信时,你需要知道不同通信方式之间的区别,那样你才能确定哪种方式对于你的特定的场景最合适,Prism类库提供了以下几种通信方式: 命令.当希望对于用户的交互马上采取动作时使用. 事件聚合.用于ViewModel,展现层,或者控制之间没有所期望的直接动作时. 区域上下文.使用它可以提供宿主和宿主区域的View之

angular控制器之间的传值

每个controller都会有自己的scope,所有的scope都是属于 $rootScope的子或者子的子... 那么问题就好解决了,通过 $rootScope.$broadcast 广播的事件每个controller都能收到事件 另外,我的经验是,尽量不要用event传数据.应该建立一个service来保存数据,并且设置相应getter/setter,具体如下: 每个controller依赖service, call service.setter(...) 统一的service.setter

angularJS--多个控制器之间的数据共享

为了在控制器之间共享数据,需要在服务中添加一个用来储存用户名的方法.记住,服务在应用的生命周期内是单例模式的,因此可以将用户名安全地储存在其中. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>12-angularjs的多个控制器数据共享</title> <script src="../js/angularjs.js"