2016-08-01 7 views
2

В приложении для запуска углового материала «UserController» определяется без ввода услуги $ scope.

Таким образом, в функции конструктора, переменные создаются в качестве свойств этого объекта:

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 ссылается в $ рамки .users

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

Он работает, хотя $ scope никогда не вводили. И если я изменю его на self.users, также работает.

Является ли $ scope неявно введенным в каждом угловом контроллере? Автоматически ли он зеркалирует этот объект в функции конструктора контроллера?

Что происходит?

Вот код https://github.com/angular/material-start

+0

У вас есть где-нибудь еще в вашем коде, где вы задаете $ scope.users? Является ли код когда-либо ударяющим, если условие правдоподобного блока? – joncodo

+0

Вы пытались запустить приложение? – user1620220

+0

Я сомневаюсь, что ваш код не дает такого сообщения, как «ReferenceError:' $ scope' не определен »... – developer033

ответ

1

Я просто клонировать репозиторий и тестирование он не работает, как вы говорили. $ Область не определена ошибка. Вы должны использовать Inject для конструктора для его работы. Нет, это не автоматически вводится, вам нужно передать $ scope в качестве аргумента для контроллера, чтобы использовать его, иначе вы должны получить ошибку. $ Scope не определено, это может быть как ваши условия предоставления в функции selectedUser, и это никогда не приходишь в рамки, чтобы реагировать на это.

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 
    } 
+0

Я думаю, вы неправильно поняли вопрос ... – developer033

+0

Можете ли вы поделиться всем кодом. Невозможно, чтобы без возможности использования инъекции. Думаю, я последовал твоему вопросу. –

+0

Я не являюсь владельцем вопроса. Я имею в виду, что спрашивающий спрашивает: «Почему код работает, если я не ввожу $ scope нигде?» « – developer033

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) { ... 
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?

Я также просмотрел весь репо и историю на этом. Похоже, это ошибка. Отличный шанс для вас создать запрос на растяжение и внести свой вклад в открытый исходный код!

1

код работает, потому что условие в

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

никогда не оценивает к истине. Аргумент, переданный selectUser в директиве HTML ng-click, не является числом, а объектом.

так что значение, присвоенное self.selected, никогда не является $ scope.users (когда я его регистрирую, я получаю ссылочную ошибку), но пользовательский объект.

Смежные вопросы