2015-05-30 2 views
3

Следующий код работает в Angular 1.2, но разрывается в 1.4 с ошибкой Ошибка: [ng: areq] Аргумент «MyController» не является функцией, полученной неопределенностью. Код исходит из книги «ng-book», а живой рабочий пример можно найти здесь: http://jsbin.com/uHiVOZo/1/edit?html,output.Нарушение изменения между AngularJS 1.2 и 1.4?

Что изменилось?

<body> 
    <div ng-controller="MyController"> 
     {{ clock }} 
    </div> 
    <script type="text/javascript"> 
     function MyController($scope) { 
      $scope.clock = new Date(); 
      var updateClock = function() { 
       $scope.clock = new Date(); 
      }; 
      setInterval(
       function() { 
        $scope.$apply(updateClock); 
       }, 
       1000 
      ); 
      updateClock(); 
     }; 
    </script> 
</body> 

(Заменить https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular.js с https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0-rc.2/angular.js в ссылке jsbin)

+1

FYI, используя' $ interval' служба позволяет вам обновлять '$ scope', не требуя использования' $ scope. $ apply() 'http://jsbin.com/zavefaqiju/2/edit (изменить: неверный URL) – azium

+0

Интересный. ect услуга, основанная на имени параметра, или второй параметр для контроллера всегда является сервисом $ interval? – AaronF

+0

Все, что угловые «регистры», контроллеры, службы, фильтры, директивы, конфиг, могут принимать любое количество «поставщиков» в качестве аргументов в любом порядке. Как только вы зарегистрируете то, что вы делаете (контроллер, например), угловой будет вводить этот объект, как '$ scope' – azium

ответ

2

Я не знаю ни одной версии углового позволил создать контроллер без первого создания модуля. В любом случае, создание экземпляра модуля и регистрация контроллера исправить вашу проблему. jsbin

Добавить это ваше приложение decalartion в HTML:

ng-app="app" 

Изменить сценарий:

angular.module('app', []) // this creates a module 

function MyController() { ... } 

// register controller to module 
angular.module('app').controller('MyController', MyController) 
+0

Далее, следующий раздел был посвящен модулям. По-видимому, в версии 1.2 Angular, объявив контроллер без модуля приложения, присвоенного ему глобальному пространству имен, что вызовет всевозможные проблемы с тестированием. Я рад, что они изменили его. – AaronF

0

См https://docs.angularjs.org/guide/migration

«Переход от 1,2 до 1,3 Контроллеры из-за 3f2232b5, $ controller больше не будет искать контроллеры в окне. просмотра окна для контроллеров изначально предназначалось для использования в примерах, демонстрациях и игрушечных приложениях. Мы обнаружили, что использование функций глобального контроллера поощряет плохую практику, поэтому мы решили отключить это поведение по умолчанию.

Для перенастройки, зарегистрировать свои контроллеры с модулями, а не подвергая их глобалов: "

До:

function MyController() { 
    // ... 
} 

После:

angular.module('myApp', []).controller('MyController', [function() { 
    // ... 
}]); 
Смежные вопросы