传统controller与controllerAs(前面为传统,后面为controllerAs,分割线分隔):

路由模块:

.state('home.packing', {
url: '/packing',
templateUrl: '/app/home/packing.html',
controller: 'home.packingController'
})

----------------------------------------------------------------

.state('home.packing', {
url: '/packing',
templateUrl: '/app/home/packing.html',
controller: 'home.packingController as vm',
})//或者下面写法
.state('home.packing', {
url: '/packing',
templateUrl: '/app/home/packing.html',
controller: 'home.packingController',
controllerAs: 'vm'
})

控制器模块:

(function () {
angular.module('app')
.controller('home.packingController',['$scope','Core',packingController])
function packingController($scope,Core) {
var context = $scope;
     context.msg = 'controller' 
context.onClickChangeService = onClickChangeService;
function onClickChangeService (msg) {
console.log(msg)
}
}
})();

----------------------------------------------------------------

(function () {
angular.module('app')
.controller('home.packingController',['Core',packingController])
function packingController(Core) {
var self = this;//self指View Module
self.msg = 'controllerAs'
self.onClickChangeService = onClickChangeService;
function onClickChangeService (msg) {
console.log(msg)
}
}
})();

html模块:

<div>{{msg}}</div>
<div ng-click="onClickChangeService(msg)">点击</div>

----------------------------------------------------------------

<div>{{vm.msg}}</div>
<div ng-click="vm.onClickChangeService(vm.msg)">点击</div>

为什么使用controllerAs:

1.$scope是基于原型进行继承的,比如说当我们查找一个user对象时,angular会先查找当前$scope有没有user,如果没有的话就继续往上层$scope查找,直至$rootScope。

而在controllerAs中,假设我们使用controllerAs

UserCtrl as ctrl 
angular将控制器自身挂载在$scope上,user也变为ctrl.user,就不会存在上述的一层层查找的过程。在很多情况下,比如在嵌套的路由中,上述$scope基于原型的查找,有时候确实会提供一些便利,但这些都可以用服务来实现,也应该使用服务来实现。

2.大家在初次接触angular时一定会被推荐过将所有数据都绑定在$scope的一个对象上(比如$scope.data)来避免一些js中值的复制和对象的引用可能会造成的一些问题(公司里的新人大部分也确实遇到过这类问题),而使用controllerAs后就不需要这一步了,因为人家本来就是。

3.因为不使用$scope也就不能使用$on,$watch,$emit之类的方法,这些方法本来就应该尽量少用,这样就可以更好的控制项目中的代码,当不得不用这类方法时可以参考下面的案例。

4.便于新人学习,我发现新人对于$scope这个东西往往无法理解,而用controllerAs vm之后,则将vm(view model的简写)作为视图模型则比较好理解。

5.在一个页面中如果使用嵌套控制器,更加清晰,并且可以避免让 $scope 默认继承父组件的内容(因为在子控制器中没有声明也会继承父控制器中的内容,造成显示错误数据)

参看链接:使用controller代替$scope

传统controller与controllerAs的更多相关文章

  1. angularJS1笔记-(13)-自定义指令(controller和controllerAs实现通信)

    index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  2. [AngularJS + Unit Testing] Testing Directive's controller with bindToController, controllerAs and isolate scope

    <div> <h2>{{vm.userInfo.number}} - {{vm.userInfo.name}}</h2> </div> 'use str ...

  3. AngularJS之指令中controller与link(十二)

    前言 在指令中存在controller和link属性,对这二者心生有点疑问,于是找了资料学习下. 话题 首先我们来看看代码再来分析分析. 第一次尝试 页面: <custom-directive& ...

  4. angular controller as syntax vs scope

    今天要和大家分享的是angular从1.2版本开始带来了新语法Controller as.再次之前我们对于angular在view上的绑定都必须使用直接的scope对象,对于controller来说我 ...

  5. [AngularJS] Best Practise - Controller

    ControllerAs: Use thecontrollerAs syntax always as it aids in nested scoping and controller instance ...

  6. [AngularJS] Accessing The View-Model Inside The link() When Using controllerAs

    If u using controller & controllerAs in directive, then the link()'s 4th param 'controller' will ...

  7. angularJS 系列(五)--controller AS 语法

    原文: http://www.cnblogs.com/whitewolf/p/3493362.html 这篇国外的文章也非常好: http://codetunnel.io/angularjs-cont ...

  8. angular directive 的controllerAs的用法

    原文: https://stackoverflow.com/questions/31857735/using-controlleras-with-a-directive --------------- ...

  9. Part 32 AngularJS controller as syntax

    So far in this video series we have been using $scope to expose the members from the controller to t ...

随机推荐

  1. SQL SERVER 2012设置自动备份数据库

    为了防止数据丢失,这里给大家介绍SQL SERVER2012数据自动备份的方法: 一.打开SQL SERVER 2012,如图所示: 服务器类型:数据库引擎: 服务器名称:127.0.0.1(本地), ...

  2. JavaScript 数组基本操作

    简介 数组操作无论是在JavaScript中还是在其他语言中都是很常见.经常会用到的,现在我把JavaScript 数组基本操作整理一下,供大家参考学习.里边包含我自己的见解以及案例,希望能够帮助大家 ...

  3. MSSQL 常用操作

    0.GUID去除横线和变换为小写 SELECT LOWER(REPLACE(LTRIM(NEWID()),'-','')) 1.IDENTITY 函数说明 IDENTITY ( data_type [ ...

  4. 宏WINAPI和几种调用约定

    在VC SDK的WinDef.h中,宏WINAPI被定义为__stdcall,这是C语言中一种调用约定,常用的还有__cdecl和__fastcall.这些调用约定会对我们的代码产生什么样的影响?让我 ...

  5. android 圆角 ImageView

    android中Imageview 内的图片圆角的实现方式 此文针对的是 imageview中图片的圆角, 即忽略掉图片的ScaleType, 均对图片采取圆角.  而不是对Imageview本身的圆 ...

  6. java八大基本数据类型

    java中八大数据类型的储存空间以及使用场景表示如下 )1.int:4字节,可以表示的数为-2^31 - 2^31-1.整数的默认类型.封装类也如此 .整数相除的时候,会舍弃小数部分.结果也是整数,例 ...

  7. 程序员的自我救赎---1.4.2: 核心框架讲解(BLL&Tool)

    <前言> <目录> (一) Winner2.0 框架基础分析 (二) 短信中心 (三)SSO单点登录 (四)PLSQL报表系统 (五)钱包系统 (六)GPU支付中心 (七)权限 ...

  8. 深入理解ES6之——JS类的相关知识

    基本的类声明 类声明以class关键字开始,其后是类的名称:剩余部分的语法看起来像对象字面量中的方法简写,并且在方法之间不需要使用逗号. class Person { //等价于prototype的构 ...

  9. P1378 油滴扩展

    题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴. ...

  10. OGNL简介

    OGNL 一:OGNL简介 OGNL的全称是Object  Graph  Navigation  Language即对象导航语音.它是一个开源项目,工作在视图层,用来取代页面中的java脚本.简化数据 ...