AngularJS全局scope与Isolate scope通信用法示例


Posted in Javascript onNovember 22, 2016

本文实例讲述了AngularJS全局scope与Isolate scope通信用法。分享给大家供大家参考,具体如下:

在项目开发时,全局scope 和 directive本地scope使用范围不够清晰,全局scope与directive本地scope通信掌握的不够透彻,这里对全局scope 和 directive本地scope的使用做一个总结。

一、scope作用域

1、AngularJS中,子作用域一般都会通过JavaScript原型继承机制继承其父作用域的属性和方法。但有一个例外:在directive中使用scope: { ... },这种方式创建的作用域是一个独立的"Isolate"作用域,它也有父作用域,但父作用域不在其原型链上,不会对父作用域进行原型继承。这种方式定义作用域通常用于构造可复用的directive组件.

2、如果我们在子作用域中访问一个父作用域中定义的属性,JavaScript首先在子作用域中寻找该属性,没找到再从原型链上的父作用域中寻找,如果还没找到会再往上一级原型链的父作用域寻找。在AngularJS中,作用域原型链的顶端是$rootScope,JavaScript寻找到$rootScope为止.

3、scope: { ... } - directive创建一个独立的“Isolate”作用域,没有原型继承。这是创建可复用directive组件的最佳选择。因为它不会直接访问/修改父作用域的属性,不会产生意外的副作用。

二、Isolate scope 引用修饰符

1、 = or =attr “Isolate”作用域的属性与父作用域的属性进行双向绑定,任何一方的修改均影响到对方,这是最常用的方式;

2、 @ or @attr “Isolate”作用域的属性与父作用域的属性进行单向绑定,即“Isolate”作用域只能读取父作用域的值,并且该值永远的String类型;

3、 & or &attr “Isolate”作用域把父作用域的属性包装成一个函数,从而以函数的方式读写父作用域的属性,包装方法是$parse

三、directive 与 controller 数据传递和通信

1、父controller监听全局scope(父scope)变量, 并广播事件给子scope(directive scope,每个directvie都有自己独立的scope作用域)

2、directive 定义本地scope,通过=、@、&(方法)字符显示引用全局scope

3、directive scope(子scope)通过parent[$scope.$parent.xxx]引用全局scope的属性

4、directive监听全局scope变量变化,可以通过$scope.$parent.$watch方法

四、实例说明

<div ng-controller="MyCtrl">
  <button ng-click="show=true">show</button>
  <dialog title="Hello }"
      visible="}"
      on-cancel="show=false;"
      on-ok="show=false;parentScope();">
    <!--上面的on-cancel、on-ok,是在directive的isoloate scope中通过&引用的。
    如果表达式中包含函数,那么需要将函数绑定在parent scope(当前是MyCtrl的scope)中-->
    Body goes here: username:} , title:}.
    <ul>
      <!--这里还可以这么玩~names是parent scope的-->
      <li ng-repeat="name in names">}</li>
    </ul>
    <div>
      Email:<input type="text" ng-model="email" style="width: 200px;height:20px"/>
    </div>
    <div>
      Count:<input type="text" ng-model="person.Count" style="width: 120px;height:20px"/>
      <button ng-click="changeCount()">Count加1</button>
    </div>
    <p></p>
  </dialog>
</div>

Controller 测试代码:

var app = angular.module("Dialog", []);
app.controller("MyCtrl", function ($scope) {
    $scope.person = {
      Count: 0
    };
    $scope.email = 'carl@126.com';
    $scope.names = ["name1", "name2", "name3"];
    $scope.show = false;
    $scope.username = "carl";
    $scope.title = "parent title";
    $scope.parentScope = function () {
      alert("scope里面通过&定义的东东,是在父scope中定义");
    };
    $scope.changeCount = function () {
      $scope.person.Count = $scope.person.Count + 1;
    }
    // 监听controller count变更, 并发出事件广播,再directive 中 监听count CountStatusChange变更事件
    $scope.$watch('person.Count', function (newVal, oldVal) {
      console.log('>>>parent Count change:' + $scope.person.Count);
      if (newVal != oldVal) {
        console.log('>>>parent $broadcast count change');
        $scope.$broadcast('CountStatusChange', {"val": newVal})
      }
    });
});
app.directive('dialog', function factory() {
    return {
      priority: 100,
      template: ['<div ng-show="visible">',
        '  <h3>}</h3>',
        '  <div class="body" ng-transclude></div>',
        '  <div class="footer">',
        '    <button ng-click="onOk()">OK</button>',
        '    <button ng-click="onCancel()">Close</button>',
        '  </div>',
        '</div>'].join(""),
      replace: false,
      transclude: true,
      restrict: 'E',
      scope: {
        title: "@",//引用dialog标签title属性的值
        visible: "@",//引用dialog标签visible属性的值
        onOk: "&",//以wrapper function形式引用dialog标签的on-ok属性的内容
        onCancel: "&"//以wrapper function形式引用dialog标签的on-cancel属性的内容
      },
      controller: ['$scope', '$attrs', function ($scope, $attrs) {
        // directive scope title 通过@ 引用dialog标签title属性的值,所以这里能取到值
        console.log('>>>title:' + $scope.title);
        >>>title:Hello carl scope.html:85
        // 通过$parent直接获取父scope变量页可以
        console.log('>>>parent username:' + $scope.$parent.username);
        >>>parent username:carl
        // directive scope 没有定义username 变量,并且没有引用父scope username变量, 所以这里是undefined
        console.log('>>>child username:' + $scope.username);
        >>>username:undefined
        // 接收由父controller广播count变更事件
        $scope.$on('CountStatusChange', function (event, args) {
          console.log("child scope on(监听) recieve count Change event :" + args.val);
        });
        // watch 父 controller scope对象
        $scope.$parent.$watch('person.Count', function (newVal, oldVal) {
          console.log('>>>>>>>child watch parent scope[Count]:' + oldVal + ' newVal:' + newVal);
        });
      }]
    };
});

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
索趣科技的答案
Feb 07 Javascript
用jscript启动sqlserver
Jun 21 Javascript
javascript判断机器是否联网的2种方法
Aug 09 Javascript
js同比例缩放图片的小例子
Oct 30 Javascript
JavaScript简单实现鼠标拖动选择功能
Mar 06 Javascript
JavaScript的原型继承详解
Feb 15 Javascript
基于jQuery制作小图标上下滑动特效
Jan 18 Javascript
jquery设置css样式的多种方法(总结)
Feb 21 Javascript
Javascript实现页面滚动时导航智能定位
May 06 Javascript
Vue的路由及路由钩子函数的实现
Jul 02 Javascript
微信小程序实现弹框效果
May 26 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
基于js实现checkbox批量选中操作
Nov 22 #Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
Nov 22 #Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
Nov 22 #Javascript
详解Js模板引擎(TrimPath)
Nov 22 #Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 #Javascript
AngularJS中指令的四种基本形式实例分析
Nov 22 #Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 #Javascript
You might like
一段php加密解密的代码
2007/07/16 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
基于jQuery的表格操作插件
2010/04/22 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
Python实现115网盘自动下载的方法
2014/09/30 Python
python中正则表达式的使用详解
2014/10/17 Python
Python图像灰度变换及图像数组操作
2016/01/27 Python
目前最全的python的就业方向
2018/06/05 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
Java面试笔试题大全
2016/11/23 面试题
我们的节日端午节活动总结
2015/02/11 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python