this与$scope
最近在Angular项目中遇到关于controller内使用$scope&this 暴露数据的问题,下面来分析一下:
"controller as" 是Angular在1.2版本后新增的语法,我将从引用方式,作用范围,对象对比三个方面做两者的比较:
引用方式:
1) $scope 只需要在注入中声明,后面就可以直接在附加数据对象:
controller:
                function ACtrl($scope) {
                    $scope.test = "一个例子"; //在$scope对象中加入test
                }
html:
<div ng-controller="ACtrl">
{{test}}
</div>
2) this 则采用了controller as(需要版本为ng 1.2+)写法:
controller:
                function BCtrl() {
                    var vm = this;
                    this.test = "一个例子"; //在this对象中加入test
                }
html:
<!-- vm为自己为当前控制器作的一个简略记号,也可以写作 BCtrl as b,
后面变量便可以在b中引出 如b.test -->
<div ng-controller="BCtrl as vm">
{{vm.test}}
</div>
作用范围:
1) $scope 中的变量或数据对象我们可以全部拿到,并且上级控制器中的变量也可以在下级控制器中被获取到:
controller:
                function ParentCtrl($scope) {
                    $scope.test = "测试";
                    $scope.cover ="覆盖测试";
                }
                function ChildCtrl($scope) {
                    $scope.cover ="子覆盖测试";
                    var test = $scope.test; //“测试”
                }
html:
<div ng-controller="ParentCtrl">
<p>Parent-test : {{test}}</p>
<p>Parent-cover : {{cover}}</p>
<div ng-controller="ChildCtrl">
<p>Child-test : {{test}}</p>
<p>Child-cover : {{cover}}</p>
</div>
</div>
我在父控制器ParentCtrl中声明的test变量并未在子控制器ChildCtrl中做声明,而在ChildCtrl作用范围内的Child-test 中,test却输出了”测试”;基于此我再做了一次覆盖测试,检测结果显示,当父子控制器同时存在相同的变量时, 父子控制器各自范围内的值不会被覆盖;
2) this 中的变量则只适用于当前控制器:
controller:
                function ParentCtrl($scope) {
                    var vm = this;
                    vm.test = "测试";
                    vm.cover ="覆盖测试";
                }
                function ChildCtrl($scope) {
                    var vm = this;
                    vm.cover ="子覆盖测试";
                }
html:
<div ng-controller="ParentCtrl as parent">
<p>Parent-test : {{parent.test}}</p>
<p>Parent-cover : {{parent.cover}}</p>
<div ng-controller="ChildCtrl as child">
<p>Child-test : {{child.test}}</p>
<p>Child-cover : {{child.cover}}</p>
</div>
<div ng-controller="ChildCtrl as parent">
<p>Child-test : {{parent.test}}</p>
<p>Child-cover : {{parent.cover}}</p>
</div>
</div>
在使用this的时候,各层级变量的命名空间是平行的状态,模板html中只可以拿到当前控制器下声明的变量。
对象对比:
controller:
            function CCtrl($scope) {
                var vm = this;
                $scope.logThisAndScope = function() {
                    console.log(vm === $scope)
                }
            }
vm与$scope实际上是不相等的,在console中我们可以看到
vm: Constructor;
$scope: $get.Scope.$new.Child;
而在$scope中又包含了一个变量vm: Constructor
实际结构是
        $scope: {
            ...,
            vm: Constructor,
            ...
        }      
那么我们可以整理如下:
$scope 当控制器在写法上形成父子级关系时,子级没有的变量或方法父级会自动强加在子级身上,子级可以任意获取到当前父级的变量或方法,该种形式是不可逆的,即父级无法通过$scope获取到子级的任意变量或方法。
this 则像一个独立的个体,所有东西都是由自己管理,也就不存在父子级变量混淆关系了。
那数据共享该如何进行呢?数据业务逻辑我觉得还是交给更专业的service来处理吧。
两种方式其实在性能上并无优劣之分,只有代码习惯的选择。
这或许可以取决于我们观察的角度,其实可以理解为私用跟公用的区别!
this与$scope的更多相关文章
- Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
		执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ... 
- 理解nodejs模块的scope
		描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ... 
- dagger2系列之Scope
		Dagger的Scope注解代表的是作用域,通过实现自定义@Scope注解,标记当前生成对象的使用范围,标识一个类型的注射器只实例化一次,在同一个作用域内,只会生成一个实例, 然后在此作用域内共用一个 ... 
- scope.$apply是干嘛的
		开始用angular做项目的时候,一定碰到过$scope.$apply()方法,表面上看,这像是一个帮助你进行数据更新的方法,那么,它为何存在,我们又该如何使用它呢. JavaScript执行顺序 J ... 
- (转)构建自己的AngularJS,第一部分:Scope和Digest
		原翻译链接:https://github.com/xufei/Make-Your-Own-AngularJS/edit/master/01.md 原文链接:http://teropa.info/blo ... 
- [Android]使用Dagger 2依赖注入 - 自定义Scope(翻译)
		以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5095426.html 使用Dagger 2依赖注入 - 自定义 ... 
- AngularJS Scope(作用域)
		1. AngularJS Scope(作用域) Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. Scope 是一个对象,有可用的方法和属性. Sc ... 
- 4种scope方法
		默认作用域,自动加载: default_scope { order(created_at: :desc) } model 调用 find_2时才运行 scope :find_2, ->{ whe ... 
- angularjs $scope.$watch(),监听值得变化
		myApp.controller('firstController',function($scope,$interval){ $scope.date = new Date(); setInterval ... 
- angularjs $scope.$apply 方法详解
		myApp.controller('firstController',function($scope,$interval){ $scope.date = new Date(); setInterval ... 
随机推荐
- 【大数据系列】hadoop上传文件报错_COPYING_ could only be replicated to 0 nodes
			使用hadoop上传文件 hdfs dfs -put XXX 17/12/08 17:00:39 WARN hdfs.DFSClient: DataStreamer Exception org.ap ... 
- css笔记 - 张鑫旭css课程笔记之 absolute 篇
			absolute地址 absolute绝对定位 绝对定位与浮动鲜为人知的兄弟关系 即是说,absolute后,元素和浮动元素的特性差不多,只不过absolute脱离文档流,元素飘在天上,float还在 ... 
- windows 电脑配置信息检测
			内存条 DDR4 DDR4相比DDR3最大的区别有: 1)处理器:每次内存升级换代时,必须支持的就是处理器.Haswell-E平台的内存同IVB-E/SNB-E一样为四通道设计,DDR4内存频率原生支 ... 
- 监控redis服务器执行的命令--类似于tomcat的local-access.log
			一.问题由来 一般程序启动时会去拉必要的缓存存进去redis. 由于我们这边开发可直连开发和测试环境,有时候会发生,开发同学本地直连了测试环境,本地ide一启动,可能会导致重新覆盖了测试环境上的缓存. ... 
- 父窗口 和 iframe 互相访问
			在父窗口中获取iframe中的元素 1. 格式:window.frames["iframe的name值"].document.getElementByIdx_x("ifr ... 
- angular开发控制器之间的通信
			一.指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式(单例模式) 二.基于scope继承的方式: 最简单的让控制器之间进行通信的方法 ... 
- vue之单表输入绑定
			vue的核心:声明式的指令和数据的双向绑定. 那么声明式的指令,已经给大家介绍完了.接下来我们来研究一下什么是数据的双向绑定? 另外,大家一定要知道vue的设计模式:MVVM M是Model的简写,V ... 
- jQuery ajax的前台代码编写
			jQuery ajax的前台代码: <script type="text/javascript" src="/include/jquery/jquery-1.1.3 ... 
- BZOJ2200 道路和航线【好题】【dfs】【最短路】【缩点】
			2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1384 Solved: 508[Submit] ... 
- LDA模型数据的可视化
			""" 执行lda2vec.ipnb中的代码 模型LDA 功能:训练好后模型数据的可视化 """ from lda2vec import p ... 
