Angular - 何时使用$ scope而不是

时间:2015-09-25 12:41:13

标签: javascript angularjs

我们何时使用$ scope,而不是使用它?没有它我似乎可以逃脱,至少就控制器定义而言(参见下面的例子)。

我对此是否正确?你能否提供一个例子,其中这个/ self不起作用,我们被迫使用$ scope?

// Method 1: Not using $scope
function LoginController() {
    var self = this;
    this.username = "";
    this.password = "";

    this.login = function() {
        if( (self.username === 'admin') && (self.password === 'admin') ) {
            // Do something
        }
    }
}

// Method 2: Using $scope
function LoginController($scope) {
    $scope.username = "";
    $scope.password = "";

    $scope.login = function() {
        if( ($scope.username === 'admin') && ($scope.password === 'admin') ) {
            // Do something
        }
    }
}

3 个答案:

答案 0 :(得分:4)

当前的Angular 2.0 Problem 2在不久的将来描述了一个没有$scope的世界,强烈建议您遵循Angular migration path,后者建议使用controllerAs语法在可能的情况下,为潜在的迁移做准备并遵守最佳实践。

也就是说,目前有一些情况, 使用$scope

$scope.$on
$scope.$broadcast
$scope.$emit
$scope.$watch
$scope.$apply

这些特殊情况都不适用于您的示例,因此您应该使用controllerAs代替$scope,I.E:

ng-controller="MyController as MyCtrl"

如果必须访问$scope才能使用上述方法之一,您可以在使用controllerAs语法时将其注入控制器:

function LoginController($scope) {
    var self = this;
    self.username = "";
    self.password = "";

    self.login = function() {
        if( (self.username === 'admin') && (self.password === 'admin') ) {
            // Do something
        }
    }

    $scope.$on('event', function () {});
}

答案 1 :(得分:2)

方法#1被广泛认为是最佳实践。我尽量避免直接引用$ scope。

$ scope不在Angular 2.0中。通过避免引用它,您的最终迁移应该更容易。

John Papa的风格指南是最佳实践的绝佳参考:https://github.com/johnpapa/angular-styleguide

答案 2 :(得分:0)

可能在$ emit和$ broadcast的情况下,我们可能总是需要$ scope。

但是方法1是非常有用的复杂的父和子实现,以避免混淆,是的,hacks是由父和子为名称加前缀,但在父和子/ s实现中仍然非常有用。