AngularJS中Scope间通讯Demo

在AngularJS中,每一个controller都有对应的Scope,而Scope间有时候需要通讯。比如有如下的一个controller嵌套:

<body ng-controller="AppCtrl">

    <table ng-controller = "ProductCtrl">
        ...
        <tr ng-repeat="product in products">
            <td>{{$index + 1}}</td>
            <td>{{product.name}}</td>
            <td>{{product.price | currency }}</td>
            <td><button ng-click="addToCart(product)">添加到购物车</button></td>
        </tr>
    </table>

    <div ng-controller="CartCtrl">
        ...
        <tr ng-repeat="product in cart">
            <td>{{$index+1}}</td>
            <td>{{product.name}}</td>
            <td>{{product.price  | currency}}</td>
            <td><button ng-click="removeFromCart(product)">remove</button></td>
        </tr>
    </div>
</body>

对应的controller部分大致是:

myApp.controller("AppCtrl", function($scope){
    $scope.title = "Product Manager";
})

myApp.controller("ProductCtrl", function($scope){
    $scope.products = [
        {name:"", price:50},
        ...
    ];

    $scope.addToCart = function(){

    }
});

myApp.controller("CartCtrl", function($scope){
    $scope.cart = [];
    $scope.removeFromCart = function(product){

    }
});

以上,呈现出的Scope间的关系如下:

$rootScope
.....$scope of AppCtrl
..........$scope of ProductCtrl
..........$scope of CartCtrl

问题来了,ProductCtrl中需要把product放到cart中,cart中需要获取到product,两者之间如何通讯呢?

→ 当在ProductCtrl中执行addToCart动作时,让$rootScope发一个广播,通知所有的子Scope

myApp.controller("ProductCtrl", function($scope, $rootScope){
   $scope.products = [
        {name:"", price:50},
        ...
    ];

    $scope.addToCart = function(product){
        //让$rootScope发一个广播,所有子scope都知道了
        $rootScope.$broadcast("addProduct", product);
    }
})

可见,$rootScope通过$broadcast方法广播事件,一个实参是事件名称,一个实参是要传递的对象。

→ 在CartCtrl中需要侦听来自$rootScope的事件,同时要把移除product的事件告知更高级别的Scope

myApp.controller("CartCtrl", function($scope){
    $scope.cart = [];

    //子scope要侦听rootScope的事件
    $scope.$on("addProduct", add);

    function add(evt, product){
        $scope.cart.push(product);
    }

    $scope.removeFromCart = function(product){
        //子scope中的事件告知更高的scope
        $scope.$emit("removeProduct", product);
    }
})

可见,在子$scope中通过$on方法侦听来自$rootScope的addProduct事件,并执行一个回调函数;如果在子$Scope中执行一个事件要告知更高级别的Scope,这里是removeFromCart事件,需要通过$emit方法,其中第一个实参也是事件名称,第二个实参是传递对象。

→ 在AppCtrl中针对来自CartCtrl中的removeProduct事件

myApp.controller("AppCtrl", function($scope){
    $scope.$on("removeProduct", function(evt, data){
        console.log(data.name + "removed");
    })
})

可见,也是通过$on方法侦听子$scope中emit发出的事件。

时间: 2024-08-02 22:54:58

AngularJS中Scope间通讯Demo的相关文章

一步步构建自己的AngularJS(2)——scope之$watch及$digest

在上一节项目初始化中,我们最终得到了一个可以运行的基础代码库,它的基本结构如下: 其中node_modules文件夹存放项目中的第三方依赖模块,src存放我们的项目代码源文件,test存放测试用例文件,.jshintrc是jshint插件的配置文件,karma.conf.js是karma的配置文件,package.json是npm的配置文件,结构其实很简单.从本节开始,会在这个代码库的基础上进行我们自己Angular的实现. 首先,在写代码之前,在命令行中输入npm test命令,让我们的测试用

一篇文章了解相见恨晚的 Android Binder 进程间通讯机制【转】

本文转载自:https://blog.csdn.net/freekiteyu/article/details/70082302 Android-Binder进程间通讯机制 概述 最近在学习Binder机制,在网上查阅了大量的资料,也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客,都是从底层开始讲的,全是C代码,虽然之前学过C和C++,然而各种函数之间花式跳转,看的我都怀疑人生.毫不夸张的讲每看一遍都是新的内容,跟没看过一样.后来又看到了Gityuan的博客看到了一

AngularJS中实现无限级联动菜单(使用demo)

原文地址:http://www.cnblogs.com/front-end-ralph/p/5133122.html 昨天没来得及贴几个使用demo,今天补上,供有兴趣的同学参考 :) 1. 同步加载子选项demo2. 异步加载子选项demo3. 初始值回填demo4. 倒金字塔依赖demo directive的源代码请移步上一个帖子:http://www.cnblogs.com/front-end-ralph/p/5131687.html 1. 同步加载子选项在各联动菜单加载之前,我们已经通过

angularjs 中的scope继承关系——(2)

转自:http://www.lovelucy.info/understanding-scopes-in-angularjs.html angularjs 中的scope继承关系 ng-include 假设在我们的 controller 中, $scope.myPrimitive = 50; $scope.myObject = {aNumber: 11}; HTML 为: <script type="text/ng-template" id="/tpl1.html&quo

通过几段代码,理清angularJS中的$injector、$rootScope和$scope的概念和关联关系

$injector.$rootScope和$scope是angularJS框架中比较重要的东西,理清它们之间的关系,对我们后续学习和理解angularJS框架都非常有用. 1.$injector其实是一个IOC容器,包含了很多服务(类似于spring框架中的bean),其它代码能够通过       $injector.get("serviceName")的方式,从injector中获取所需要的服务.详情参考这篇文章 2.scope是angularJS中的作用域(其实就是存储数据的地方)

angularjs中directive声明scope对象时修饰符解释和用法

在angular中我们定义directive方法时,可以看到 return { restrict: 'AE', scope: {}, template: '<div></div>', link: function() {} } 除了代码中出现的属性,还有一些其他的属性可供配置,这里不作详述. 今天我们要说的重点是scope字段. 常规用法设置 scope: { name: '=', age: '=', sex: '@', say: '&' } 假设我们的hml代码如下 &l

angularjs 中的scope继承关系——(1)

转自:http://www.lovelucy.info/understanding-scopes-in-angularjs.html JavaScript 的原型链继承 假设父类 parentScope 有如下成员属性 aString, aNumber, anArray, anObject, 以及 aFunction.子类 childScope 原型继承父类 parentScope,于是我们有: 如果子 Scope 尝试去访问 parentScope 中定义的属性,JavaScript 会先在子

angularjs学习之八(angularjs中isolate scope的使用)

angular js中指令directive有个特别实用的东西,那就是 isolate scope (被隔离的scope) 关于详细他和全局的scope 有什么差别.能够參考以下这篇博文: AngularJS 全局scope与Isolate scope通信 本文主要解说 其详细的几种使用方式: 1. = 的使用 [html] <div class="card" ng-repeat="app in apps"> <app-info info=&quo

AngularJS中监视Scope变量以及外部调用Scope方法

在AngularJS中,有时候需要监视Scope中的某个变量,因为变量的改变会影响一些界面元素的显示.有时,也希望通过jQuery调用Scope的某个方法. 比如以下场景: <div> <button id="jQBtn">jQ Button</button> </div> <div id="ngSection" ng-controller="NGCtrl"> <input typ