0

关于$scopethis使用 ui-router 时,

如果我使用controllerAs语法,即:

.config(['$stateProvider', function($stateProvider) {
    $stateProvider
        .state('app.login', {
            url: '/login',                  
            templateUrl: 'modules/login/login.html',
            controllerAs: 'login',
            controller: 'LoginCtrl',
            data: {
                authorizedRoles: [USER_ROLES.all]
            }
        });
}])

然后在我的控制器中,我使用this而不是$scope. 所以我的登录控制器中有这样的代码:

this.func1 = func1;
this.func2 = func2;
this.message = "Hello world!";

但我也$scope用来收听来自 my 的全球广播事件$rootScope,因为如果我没记错的话,即使它们正在互换,this也没有属于 的方法。$scope

$scope.$on('event', handler);

所以我正在收听一个事件广播$rootScope并调用其他一些控制器逻辑,例如func2,当这个事件被广播时:

$scope.$on('auth-login-failed', function(event) {
// call some other function in controller
});

如果我想func2在处理程序内部调用$on怎么办?我应该做一些约定,在我的控制器中初始化这样的东西吗?

var that = this;

$scope.$on('auth-login-failed', function(event) {
    this.func2();
});

我只是对最好的进行方式以及这里的一般约定感到好奇。$scope两者都使用和是否合适,两者this之间的主要区别是什么,因为它们可以互换?

4

1 回答 1

0

您的建议也将逻辑上下文保持在某个变量中-非常好,而且是很好的做法:

var _this = this;

$scope.$on('auth-login-failed', function(event) {
    _this.func2();
});

事实上,这就是Typescript我们在幕后做同样事情的方式。它被称为

箭头功能

在打字稿中看起来像这样:

$scope.$on('auth-login-failed', (event) => {
    this.func2();
});

因为幕后的 Typescript 编译器将执行上述技巧,并将逻辑范围保存在某个变量中。

我会建议你:

... 最好开始使用 Typescript。无论如何,这是角世界的未来......

有一些链接指向如何在 中创建角度的一些细节controllerTypescript包括工作示例

于 2015-10-25T15:04:54.903 回答