2015-09-25 22 views
1

我们何时使用$ scope,而不是使用它?看起来我可以离开它,至少就控制器定义而言(参见下面的例子)。

我正确吗?你能否提供一个例子说明这个/自己不行,我们被迫使用$ 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 
     } 
    } 
} 
+1

第一种方法可以与'controllerAs'语法一起使用,这有一些优点。 – raina77ow

+1

http://stackoverflow.com/questions/11605917/this-vs-scope-in​​-angularjs-controllers –

+0

可能的副本还有一些其他角度函数内置到'$ scope'中,比如'$ scope。$ watch'。 – ryanyuyu

回答

4

当前角度2.0 migration path描述了一个世界上没有$scope在不久的将来,并强烈建议您遵循角度style guide,这反过来又建议使用尽可能使用语法,以便为潜在迁移做准备并坚持最佳实践。

也就是说,目前有少数情况下,你使用$scope

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

没有这些特殊情况的申请你的榜样,所以你应该使用controllerAs代替$scope,IE:

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() {}); 
} 
2

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

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

约翰爸爸的风格指南是最佳做法有很大的参考:https://github.com/johnpapa/angular-styleguide

+0

谢谢。因此,如果$ scope不在Agular 2.0中,$ on/$ emit/$ broadcast将如何工作?有其他选择吗? – Ricky

+0

我真的只在2.0上阅读,尽管我正在努力让自己的迁移变得更加容易,但我现在使用的是1.x版本。我看到的一般建议是尽量避免$ emit并使用$ broadcast。 –

0

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

但方法1是非常有用的复杂的父母和孩子的实施,以避免混淆,是的,黑客有父母和孩子的名称前缀,但仍然非常有用的父母和孩子的实施。

相关问题