Error: $scope.$watch is not a function Angular 1.6

123
02 марта 2021, 20:30

Объявляю $watch на переменную, но вылетает эта ошибка:

В аналогичном коде в другом js-файле этой ошибки нет.

1) Подключение контроллера #2, где сыпется ошибка:

angular
.module('form2', [...])
.controller('form2Controller', ['$q', '$scope', '$timeout', 
function($scope, $timeout, $q, ...)...])

2) Откуда летит:

$scope.$watch('model.value2', function ()
{
    $scope.getForm();
});

3) Контроллера с аналогичным кодом, где нет ошибки и все запускается:

angular
.module('form1', [...])
.controller('form1Controller', ['$q', '$scope', '$timeout', 
 function($scope, $timeout, $q, ...)...])

4) идентичный участок рабочего кода, но к другой переменной в другом контроллере:

$scope.$watch('model.value1', function ()
{
    $scope.refresh();
});

5) Подключение модулей:

angular.module('content', [
    'form1',
    'form2',
])

6) Подключение контроллеров в div:

<div ng-controller="form1Controller">...</div>
<div ng-controller="form2Controller">...</div>
Answer 1

Проблема кроется вот в этом месте:

.controller('form2Controller', ['$q', '$scope', '$timeout', 
function($scope, $timeout, $q, ...)...])

Для того чтобы Dependency Injection (DI) работало корректно, важно, чтобы порядок параметров, передаваемых в контроллер, перечисленный в описании DI совпадал с порядком в сигнатуре функции контроллера. Чтобы понять, почему это важно, достаточно представить, что этот код будет подвергнут минификации. Он станет выглядеть как-то так:

.controller('form2Controller', ['$q', '$scope', '$timeout', 
function(a, b, c, ...)...])

И тогда единственным способ для ангуляра понять, что при вызове контроллера вторым параметром, например, надо передавать $timeout — это ориентироваться на порядок, в котором аргументы перечислены в начале массива.

В общем, для исправления проблемы надо указать параметры в нужном порядке. Либо так:

.controller('form2Controller', ['$q', '$scope', '$timeout', 
function($q, $scope, $timeout, ...)...])

, либо так:

.controller('form2Controller', ['$scope', '$timeout', '$q', 
function($scope, $timeout, $q, ...)...])
READ ALSO
JavaScript. Мгновенная печать

JavaScript. Мгновенная печать

Возможно сделать так, что при открытии html файла, он сразу выводился на печать (в PDF) без данного окна? (изображение ниже)

127
Как удалить элемент без идентификатора

Как удалить элемент без идентификатора

Есть div, который не имеет ни класса, ни id или nameРедактировать html код этого тега нельзя (то есть нельзя приписать ему идентификатор)

93
Python 3 scripts, html [закрыт]

Python 3 scripts, html [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

86
Как воспроизвести поток M3U8

Как воспроизвести поток M3U8

Есть плеер он хорошо воспроизводит потоки, но с конкретно этот не воспроизводит :http://persikby/stream/975/377885/34

116