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 相关文章推荐
JS 无法通过W3C验证的处理方法
Mar 09 Javascript
javascript 通用loading动画效果实例代码
Jan 14 Javascript
Jquery修改页面标题title其它JS失效的解决方法
Oct 31 Javascript
JS制作简单的三级联动
Mar 18 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
Sep 14 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
Nov 29 Javascript
从零开始用electron手撸一个截屏工具的示例代码
Oct 10 Javascript
vue中导出Excel表格的实现代码
Oct 18 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
Sep 23 Javascript
Vue+abp微信扫码登录的实现代码示例
Jan 06 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
Aug 31 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
PHP+MYSQL开发工具及资源收藏
2007/01/02 PHP
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
PHP 文件类型判断代码
2009/03/13 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
vue-cli3自动消除console.log()的调试信息方式
2020/10/21 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
yy生日主持词
2014/03/20 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
财务会计专业自荐书
2014/06/30 职场文书
期末个人总结范文
2015/02/13 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript