4

Я пытаюсь наследовать контроллер angularjs с использованием расширений Typcript. Но как только я продлить angularjs контроллер выдает эту ошибку:Не удается расширить контроллер angularjs в машинописном тексте

Error: Argument 'GenericLookupCtrl' is not a function, got undefined

Вот мой упрощен код родительских и дочерних классов:

Родитель первый:

module Controllers.SolMan 
{ 
    export class ParentCtrl 
    { 
     constructor(
      seUIConfigsCacheService: Services.CrossCutting.UIConfigsCacheService, 
      seHttpService: Services.CrossCutting.HttpService, 
      $scope: Interfaces.IParentScope, 
      genericServices: Services.CrossCutting.GenericService, 
      $compile) 
     { 
      console.log('parent'); 
     } 
    } 
} 

Ребенок:

module Controllers.SolMan { 

    export class ChildCtrl extends ParentCtrl { 
     constructor(
      seUIQueryConfigsCacheService: Services.CrossCutting.UIConfigsCacheService, 
      seHttpService: Services.CrossCutting.HttpService, 
      $scope: Interfaces.IChildScope, 
      genericServices: Services.CrossCutting.GenericService, 
      $compile, 
      $injector) { 
       super(seUIConfigsCacheService, seHttpService, $scope, genericServices, $compile); 
       console.log('Child'); 
     } 
    } 
} 

Вот как регистрируются контроллеры:

.controller('ParentCtrl', Controllers.ParentCtrl) 
.controller('ChildCtrl', Controllers.ChildCtrl) 

Я могу использовать простое наложение углов на контроллеры, но для вызова родительских методов из дочернего я должен продлить его, потому что иначе typescript дает ошибку, что он не может найти метод в родительском.

ответ

6

Вы должны убедиться, что ParentCtrl определен доChildCtrl. Вы можете сделать это, правильно упорядочив теги скриптов или ваш ссылочный файл или конфигурацию requirejs в зависимости от того, какой метод вы используете.

В качестве альтернативы поместить их в одном файле:

module Controllers.SolMan 
{ 
    export class ParentCtrl 
    { 
     constructor(
      seUIConfigsCacheService: Services.CrossCutting.UIConfigsCacheService, 
      seHttpService: Services.CrossCutting.HttpService, 
      $scope: Interfaces.IParentScope, 
      genericServices: Services.CrossCutting.GenericService, 
      $compile) 
     { 
      console.log('parent'); 
     } 
    } 
} 
module Controllers.SolMan { 

    export class ChildCtrl extends ParentCtrl { 
     constructor(
      seUIQueryConfigsCacheService: Services.CrossCutting.UIConfigsCacheService, 
      seHttpService: Services.CrossCutting.HttpService, 
      $scope: Interfaces.IChildScope, 
      genericServices: Services.CrossCutting.GenericService, 
      $compile, 
      $injector) { 
       super(seUIConfigsCacheService, seHttpService, $scope, genericServices, $compile); 
       console.log('Child'); 
     } 
    } 
} 

Существует больше о TypeScript modules here

+0

спасибо! добавив их в один файл, удалила ошибку. Но я хотел бы, чтобы они были в отдельных файлах. Хорошо, теперь я понимаю, вы имеете в виду, как файлы js включены в мой код, и да, на который ссылается родитель. – Haris

+0

@Haris Я знаю, что это своего рода старый, но я недавно столкнулся с той же проблемой - и да, базовый класс был включен ранее в файл ссылки. Я понял, что реальной проблемой является то, как файлы анализируются в машинописном тексте. Вам нужно отредактировать файл решения в блокноте и гарантировать, что ваш родительский файл .ts (базовый класс) вставлен перед дочерним элементом. Первые .ts-файлы генерируются в верхней части приведенного файла main.js. Тогда это работает! Ура! – rodrigogq

+1

@rodrigogq Я настоятельно рекомендую вам использовать файл 'reference' для сортировки файлов https://github.com/TypeStrong/grunt-ts#javascript-generation. Или использовать внешние модули для полного обхода проблемы. Https://www.youtube .com/смотреть? v = KDrWLMUY0R0 & HD = 1 – basarat

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

  • Нет связанных вопросов^_^