2016-12-14 3 views
0

У меня есть проект MVC 5 с использованием TypeScript и угловой. У меня есть три файла TS: для упрощения мы будем называть их Controller1.ts, Controller2.ts и app.ts. Проблема в том, что когда я запускаю программу в первый раз, все, что УЗЛЫ (но не всегда) компилируется просто отлично и в правильном порядке. Однако, как только я что-то меняю и снова сохраняю, чтобы вызвать перекомпиляцию, он меняет порядок классов в выведенном app.js, что приводит к тому, что содержимое app.ts (где создается угловое приложение) запускается до или оба контроллера определены, выбрасывая эту ошибку:TypScript не компилирует классы в последовательном порядке

[ng:areq] Argument 'ProviderScorecardController' is not a function, got undefined 

Вот как я определил мой app.ts файл:

/// <reference path="_app.d.ts" /> 

module mqApp { 
'use strict'; 

    if (typeof (angular) != "undefined") { 

     var modules = []; 

     angular.module("mqApp", modules) 
      .controller("Controller1", Controller1) 
      .controller("Controller2", Controller2); 
    } 
} 

оба контроллера идентичны этому для имени класса, за исключением:

/// <reference path="../../_app.d.ts" /> 

module mqApp { 
    'use strict'; 

    export class Controller1 { 
     public static $inject = [ 
      '$scope' 
     ]; 

     private scope: angular.IScope; 

     constructor($scope: angular.IScope) { 
      this.scope = $scope; 
      console.log("Master Controller Instantiated"); 
     } 
    } 
} 

Мой _app.d.ts файл, который связан с выше файла TS:

/// <reference path="_references.d.ts" /> [This just contains angular/jquery references] 
/// <reference path="code/controllers/Controller2.ts" /> 
/// <reference path="code/controllers/Controller1.ts" /> 
/// <reference path="app.ts" /> 

Изменение порядка ссылок не имеет никакого эффекта. Что я делаю не так? Почему он не будет компилироваться в правильном порядке?

Я бегу Angular 1.6 и TypeScript 1.8.

ответ

1

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

Все ваши файлы ссылаются на этот файл _app.d.ts, что означает, что каждый из файлов зависит от всех остальных.
Использование файла d.ts является хорошей практикой при загрузке библиотек (например, то, что делает typings), потому что эти библиотеки не зависят от ваших исходных файлов и поэтому нет риска круговых зависимостей.

В вашем случае это должно быть:

// app.ts file 

/// <reference path="./_references.d.ts" /> 
/// <reference path="./code/controllers/Controller1.ts" /> 
/// <reference path="./code/controllers/Controller2.ts" /> 

... 

И:

// Controller1.ts 

/// <reference path="./_references.d.ts" /> 

... 

Вы можете создать d.ts файлы, которые разделяют общие потребности, но убедитесь, что вы не до конца с окружностью ,

+0

Это было 100% проблемой. Благодаря! Почесал голову на несколько часов. У предыдущего программиста была такая же настройка в другом проекте, и я скопировал структуру. Не совсем уверен, почему он работал раньше. –

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