在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?它是否在控制器构造函数中自动镜像此对象?
发生了什么事?
答案 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是否真的被调用了吗?
我也查看了整个回购和历史。看起来这是一个错误。您有机会创建拉取请求并为开源做出贡献!