比如下面这段代码:
$stateProvider.state({
name: 'reader.create',
url: '/create',
templateUrl: 'controllers/reader/create.html',
controller: 'ReaderController as vm'
});
但是在对应的controller中, 又有
var vm = this;
这么一句.
这到底有什么用?
首先这里的 vm 是指 View Model。
其实,关于这个问题,有三个重要的原因:
历史原因
controller as
是1.2之后才有,和$scope
作用其实一样,哪怕你混合着用也是没有问题,但这样看起来非常的奇怪。模板作用域
当然,不光如此,不然还要造个
controller as
做什么,是吧!这是因为早先
$scope
对于子组件默认继承父组件的数据,但又不会被覆盖,而反之又是隔离的,例如:ChildCtrl
并没有定义name
,但依然可以显示:asdf。这就是继承关系,通过这种方式来访问一些变量很不可靠,或者说并不直观。所以,才有controller as
。这样的写法不是更明了,直观了吗?
控制器 $scope !== this
先理解模板,那再看这一条就明了许多。
为了不让
$scope
默认继承父组件的内容,因此需要使用this
让这些东西不再和子组件有瓜葛。this
与$scope
完全不一样,前者就是明确表示控制组实例,而后者是一个比较奇特的this怪咖。最后关于
var vm = this
,你要愿意叫一个var funkScopeTenThousandsYear = this
也行。以上!