$ scope未注入,仍然引用。它为什么有效?

时间:2016-08-01 18:51:49

标签: javascript angularjs angularjs-scope this

在Angular Material Starter App中,定义了'UserController'而没有注入$ scope服务。

因此在构造函数中,变量被创建为This对象的属性:

function UserController( userService, $mdSidenav, $mdBottomSheet, $timeout, $log ) 
{
    var self = this;

    self.selected     = null;
    self.users        = [ ];
    self.selectUser   = selectUser;
    self.toggleList   = toggleUsersList;
    self.makeContact  = makeContact;

但是,在self.selectUser函数中,数组self.users的值被引用为$ scope.users

  function selectUser ( user ) {
  self.selected = angular.isNumber(user) ? $scope.users[user] : user;
}

即使从未注入$ scope,它仍然有效。如果我把它改成self.users,也可以。

每个Angular控制器是否隐式注入$ scope?它是否在控制器构造函数中自动镜像此对象?

发生了什么事?

这是代码https://github.com/angular/material-start

4 个答案:

答案 0 :(得分:1)

我刚刚克隆了回购并且测试它没有像你说的那样工作。$ scope没有定义错误。你必须注入构造函数才能工作 不,它不是自动注入你需要将$ scope作为参数传递给控制器​​使用它否则你应该得到错误$ scope未定义它可能就像你在selectedUser函数中的给定条件而且它永远不会到$ scope以便做出反应这一点。

    function UserController( userService, $mdSidenav, $mdBottomSheet, $timeout, $log , $scope) 
    {
}
function selectUser ( user ) {
      //try to change this line and run code and select a user you will get error
      self.selected = angular.isNumber(1) ? $scope.users[user] : user;
      console.log($scope) //$scope is undefine
    }

答案 1 :(得分:1)

代码有效,因为

中的条件
   function selectUser ( user ) {
  self.selected = angular.isNumber(user) ? $scope.users[user] : user;
}

永远不会评估为真。在HTML ng-click指令中传递给selectUser的参数不是数字,而是对象。

所以分配给self.selected的值永远不是$ scope.users(当我记录它时,我得到引用错误)但是用户对象。

答案 2 :(得分:0)

这看起来像代码中的缺陷。此评论表明userService参数最初名为$scope

/**
   * Main Controller for the Angular Material Starter App
   * @param $scope
   * @param $mdSidenav
   * @param avatarsService
   * @constructor
   */
function UserController( userService, $mdSidenav, $mdBottomSheet, $timeout, $log ) { ...

答案 3 :(得分:0)

Javascript不是一种编译语言,而是一种解释型语言。这意味着代码仅针对程序所需的部分运行。

请参阅此示例代码:

if(true){
   a = 12
}else{
   hkjkjdkjhkjsfdjhsdf87678
}

注意:此代码永远不会抛出任何类型的错误,因为代码永远不会被命中。

在您的示例中,这看起来像是从未命中的代码中的错误。我不确定你为什么没有得到参考错误,但必须注入它。

此评论:https://github.com/angular/material-start/blob/master/app/src/users/UserController.js#L12

让我相信它曾经存在过,但却被误删了。

但是,该文件的第一次提交也缺少$ scope参数。你能拆分出if块并验证$ scope是否真的被调用了吗?

我也查看了整个回购和历史。看起来这是一个错误。您有机会创建拉取请求并为开源做出贡献!