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 相关文章推荐
javascript 兼容FF的onmouseenter和onmouseleave的代码
Jul 19 Javascript
初学JavaScript第二章
Sep 30 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
JS截取字符串常用方法详细整理
Oct 28 Javascript
通过正则表达式实现表单验证是否为中文
Feb 18 Javascript
JavaScript跨域方法汇总
Oct 16 Javascript
js删除Array数组中指定元素的两种方法
Aug 03 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
Nov 15 Javascript
无循环 JavaScript(map、reduce、filter和find)
Apr 08 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
Jul 26 Javascript
javascript删除数组元素的七个方法示例
Sep 09 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 Javascript
基于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
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
php中curl使用指南
2015/02/05 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
js闭包实例汇总
2014/11/09 Javascript
javascript关于继承解析
2016/05/10 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
简单介绍Python中的readline()方法的使用
2015/05/24 Python
windows下python连接oracle数据库
2017/06/07 Python
python与C互相调用的方法详解
2017/07/14 Python
python 除法保留两位小数点的方法
2018/07/16 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
中专生自荐信
2013/10/12 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android