Angular(一):Controller中this与$scope的区别与联系

本文详细解析了Angular中Controller的初始化过程及使用方式,对比了通过Controller实例与$scope来操作数据的区别,帮助开发者更好地理解和运用Angular。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在了解他们的区别之前,首先要理解Controller的初始化过程,对Angular而言,每个Controller都是一个个的构造函数,必须要实例化后才能进行调用,所以,Controller在调用时,已经以new的方式执行过一次(请注意,是以new的方式,并不是直接调用),所以必定会生成一个Controller实例,而且每一个Controller都是不同的实例,绝不会相互干扰,从而此实例也必然会继承构造函数中this绑定的所有属性与方法,请看下面的例子:

<!-- 必须要以as的方式才能获取到此实例 -->
<div class="container" ng-controller="AppCtrl as ac">
    <h2 ng-click="ac.toggle()">{{ac.username}}</h1>
</div>
<script>
    //  完全可以不使用$scope
    app.controller('AppCtrl', function() {
        this.username = 'yiifaa';
        this.toggle = function () {
            if(this.username == 'yiifaa') {
                this.username = 'yiifee'
            } else {
                this.username = 'yiifaa'
            }
        }
    });
</script>

在上面的HTML代码中,必须以限定名的方式使用Controller的属性与方法,为什么呢?因为它们没有定义在$scope中啊,就是这么简单。

从而,我们可以很容易写出基于$scope的代码,如下:

<div class="container" ng-controller="AppCtrl">
    <h2 ng-click="toggle()">{{username}}</h1>
</div>
<script>
    //  完全可以不使用this,这里的this是指构造函数的上下文,并非this这个单词
    app.controller('AppCtrl', function($scope) {
        $scope.username = 'yiifaa';
        $scope.toggle = function () {
            //  因为是方法作用域,这里的this指向$scope
            if(this.username == 'yiifaa') {
                this.username = 'yiifee'
            } else {
                this.username = 'yiifaa'
            }
        }
    });
</script>

区别在哪里?一眼就可以出来,不需要对象的限定名了。

从上面的代码可以看出,它们其实没什么联系,如果非要说有的话,那么它们都可以在同一个构造函数中互相访问,$scope是这个函数的形参,this是这个函数的上下文,所以它们绝对不是同一个对象(似乎应该说三遍比较好)。

在this中引用$scope

在第一种方案中引用$scope,因为依赖于HTML定义中Controller的实例名称,所以灵活性,一般较少使用,如下:

this.toggle = function () {
    //  通过$scope依旧可以获取此对象
    alert($scope.ac.username)
    if(this.username == '李浩') {
        this.username = '王菲'
    } else {
        this.username = '李浩'
    }
}

在$scope中获取this

这充分利用了Controller实例的唯一性,将方法定义在scopethisscope的复杂度,从而在HTML中引用时,属性必须加上实例限定名,这也是官方的示例,代码示例如下:

app.controller('AppCtrl', function($scope) {
        var that = this;
        that.username = 'yiifaa';
        $scope.toggle = function () {
            //  因为是方法作用域,这里的this指向$scope
            if(that.username == 'yiifaa') {
                that.username = 'yiifee'
            } else {
                that.username = 'yiifaa'
            }
        }
});

结论

Controller中的this与$scope都可以存储域数据信息,无论哪种方案都可以轻松解决域数据与视图的关联性问题,但最好不要域数据分散存储两个对象中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值