【问题标题】:$scope not injected, still referenced. Why does it work?$scope 没有注入,仍然被引用。为什么它起作用?
【发布时间】:2016-08-02 03:59:16
【问题描述】:

在 Angular Material Starter App 中,定义了一个“用户控制器”而不注入 $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,也可以。

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

发生了什么事?

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

【问题讨论】:

  • 您的代码中是否还有其他地方设置了 $scope.users?如果条件为真,代码是否会遇到这种情况?
  • 您是否尝试过运行该应用程序?
  • 我怀疑你的代码没有给出类似“ReferenceError: $scope is not defined”的消息...
  • @joncondo 我没有找到任何以前的设置或注射。而且代码运行良好,所以我一定错过了注入。
  • @jocondo 知道了。 self.selected = angular.isNumber(user) 中的条件? $scope.users[user] : 用户;永远不会计算为真,因为在 HTML ng-click 指令中传递给函数的参数不是数字,而是对象。所以分配的值永远不是 $scope.users (当我记录它时,我得到了引用错误),而是用户对象。

标签: javascript angularjs angularjs-scope this


【解决方案1】:

我刚刚克隆了 repo 并测试了它没有像你说的那样工作。$scope is not defined 错误。你必须注入构造函数才能工作 不,它不是自动注入的,您需要将 $scope 作为参数传递给控制器​​才能使用它,否则您应该得到错误 $scope is undefined 它可能就像您在 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
    }

【讨论】:

  • 你能分享整个代码吗?没有注入作用域是不可能的。我想我听懂了你的问题。
  • 我不是问题的所有者。我的意思是提问者在问:“如果我没有在任何地方注入 $scope,为什么代码可以工作?
  • 对不起,我从来没有看到用户名,但它不能工作他应该得到运行时错误,因为我遇到了很多次?
  • @JorawarSingh 我一定在某处错过了注射github.com/angular/material-start
  • 你能不能做 console.log($scope) 看看它是否打印出来??
【解决方案2】:

代码有效,因为条件在

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

从不计算为真。在 HTML ng-click 指令中传递给 selectUser 的参数不是数字,而是一个对象。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      查看此示例代码:

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

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

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

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

      让我相信它以前就在那里,但被错误地删除了。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-12
        • 2016-12-31
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多